我有一个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;
}
第二CCD_ 1不删除任何元素。我观察到我对列表的第三个元素有松散的访问权限(在擦除之后(,为了访问这个元素,我在第二个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)
并没有移除mylist.erase_after(iter[2]);
0所指向的元素,而是移除它后面的元素(因此是"之后"(。