forward_list C++ 的迭代器

问题描述

我有一个 forward_list,我需要保留列表元素的迭代器,以便在它们满足某些属性删除它们。

#include<iostream>
#include<vector>
#include <algorithm>
#include<forward_list>

int main(){

std::forward_list<int> mylist = {0,10,20,30,40,50,60,70};
std::vector<std::forward_list<int>::iterator> iter;

for(std::forward_list<int>::iterator it = mylist.begin(); it != mylist.end(); ++it){
    iter.push_back(it);
}

mylist.erase_after(iter[2]);
iter.erase(iter.begin()+2);


mylist.erase_after(iter[2]);
return 1;
}

第二个 mylist.erase_after(iter[2]); 不会删除任何元素。我发现我无法访问列表的第三个元素(擦除后),为了访问这个元素,我在第二个 mylist.erase_after(iter[2]); 之前添加了以下代码

int i=0;
for(auto it= mylist.begin();i<=2;++it,++i){
    if(i==2)
    iter[2]=it;
}

这是删除列表元素后获得访问权限的最佳方式吗?

解决方法

mylist.erase_after(iter[2]) 使引用被擦除元素的任何迭代器无效 - 包括 iter[3]。在 iter.erase(iter.begin()+2); 之后,曾经在 iter[3] 中的无效迭代器现在在 iter[2] 中。最后,mylist.erase_after(iter[2]); 通过访问无效迭代器表现出未定义的行为。

回想一下,erase_after(some_iter) 不会删除 some_iter 指向的元素,而是删除它后面的元素(因此是“after”)。