【问题标题】:convert pointer to iterator将指针转换为迭代器
【发布时间】:2023-04-04 15:12:01
【问题描述】:

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

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

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

这些结构存储在两个向量中,这些结构称为 vec_id 和 vec_person。 我需要在 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). 

谢谢大家帮忙

【问题讨论】:

  • 停止在容器中存储指针(除非你需要多态性——即使你有多态性,你也可以用一个类包装它或使用 std::shared_ptr/std_unique_ptr)
  • "我的问题是将 p_id 转换为指针。"但是p_id 已经在您的示例中是一个指针!

标签: c++ pointers iterator


【解决方案1】:

要将迭代器 it 转换为指针,请使用表达式 &*it。

要将指向 int 右值的指针(例如 ...)转换为 vector::iterator,请使用以下声明:

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

【讨论】:

    【解决方案2】:

    您不能仅仅将值(在本例中为指针)“转换”为迭代器。您必须搜索向量内的值并将其删除。您可以使用 std::remove_if 算法从范围中删除某些值。如果每个人都链接到一个 id,或者可能使用不同的容器,例如地图,您也可以考虑不保留两个向量。

    【讨论】:

    • 我忘了提到向量是用唯一元素排序的,所以像 std::remove_if 这样的线性算法不会是一个好的选择。我也只能使用矢量容器。也许 lower_bound 是最好的选择?
    【解决方案3】:
    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() );
    }   
    

    【讨论】:

    • 我忘了提到元素是唯一的(并且是有序的)。所以用 lower:bound 替换 equal_range 可以正常工作吗?
    • @user2109307 在这种情况下,您应该检查迭代器是否确实指向找到的元素。
    【解决方案4】:

    我刚刚找到了这个解决方案

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

    【讨论】:

    • 最好使用data()而不是非标准函数。
    • @Adrian 是的,你是对的
    猜你喜欢
    • 2010-10-19
    • 1970-01-01
    • 2016-09-17
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-12
    • 2015-04-28
    • 1970-01-01
    相关资源
    最近更新 更多