问题描述
我有一个 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”)。