c++ 将指针转换为迭代器

zsohkypk  于 2023-05-02  发布在  其他
关注(0)|答案(4)|浏览(176)

我有两个结构体,它们相互指向

struct Person{
  string name;
  string born;
  int age;
  Id* p_id;
};

struct Id{
  string id_number;
  Person* p_person;
};

这些结构被存储在称为vec_id和vec_person的那些结构的两个ponter向量中。我需要在vec_person中找到Person的函数,然后删除vec_id中匹配的ID。我的问题是将p_id转换为指针。
我的代码示例:

std::vector<Person*> vec_person;
std::vector<Id*> vec_id;
vector <Person*>::iterator lowerb=std::lower_bound (vec_person.begin(), vec_person.end(), Peter, gt);
//gt is matching function which is defined elsewhere
//peter is existing instance of struct Person
// lowerb is iterator, that works fine.
vec_id.erase((*lowerb)->p_id);
//gives error: no matching function for call to ‘std::vector<Person*>::erase(Person*&)’|
//if i can convert pointer (*low)->pnumber to iterator, it would be solved(i guess).

Thx for help

11dmarpk

11dmarpk1#

要将迭代器it转换为指针,请使用表达式&*it
将指针转换为int右值(e.例如,...)转换为vector<int>::iterator,使用声明:

vector<int>::iterator it(...);
093gszye

093gszye2#

你不能只是把一个值(这里是指针)“转换”成一个迭代器。你必须搜索向量中的值并删除它。你可以使用std::remove_if算法从一个范围中删除某些值。如果每个Person都链接到一个id,或者可能使用不同的容器(如map),您也可以考虑不保留两个向量。

ct2axkht

ct2axkht3#

我刚找到这个解决办法

auto iter = vec.begin() + (pointer - vec.data());
2fjabf4q

2fjabf4q4#

auto p = std::equal_range( vec_person.begin(), vec_person.end(), Peter, gt );

if ( p.first != p.second )
{
   vec_id.erase( std::remove( vec_id.begin(), vec_id.end(), *p.first ), 
                 vec_id.end() );
}

相关问题