我所遇到的一个问题调用下面的代码:使用std ::双端队列:迭代(在C++ STL),用于搜索和删除某些元件
#include<deque>
using namespace std;
deque<int> deq = {0,1,2,3,4,5,6,7,8};
for(auto it = deq.begin(); it != deq.end(); it++){
if(*it%2 == 0)
deq.erase(it);
}
这导致段故障。在调查问题后,我发现问题存在于STL管理deques迭代器的方式中:如果正在擦除的元素更接近deque末尾,则用于指向已擦除元素的迭代器现在将指向NEXT元素,但不是vector::iterator
所做的前一个元素。我知道修改循环条件从it != deq.end()
到it < deq.end()
可能可以解决这个问题,但我只是想知道是否有办法在“标准格式”中擦除deque中的某个元素,以便代码可以兼容其他容器类型也是如此。
使用'std :: remove_if'。 – chris 2013-03-19 01:55:58
你可以在分配给std :: remove_if的函数(或函数对象)中执行操作,那么你仍然可以使用std :: remove_if(如@Fraser建议)。我会建议使用通用算法而不是简单循环,因为循环对于您的意图不够清楚。另外,我认为在同一时间修改和遍历容器是危险的。 – 2013-03-20 02:10:22