C++ C++;std::list:在迭代时擦除/删除元素
可能重复:C++ C++;std::list:在迭代时擦除/删除元素,c++,list,stl,C++,List,Stl,可能重复: 我在函数中有一个循环,它从头到尾迭代std::list 在每个周期中,我都会对当前列表项执行一些检查和操作,在某些情况下,我希望将其从列表中删除 现在,正如预期的那样,我的迭代器失效了 有没有办法解决这个问题,在遍历列表时从列表中删除元素 使用后缀增量 list.erase(it++); it增加,因此它不再引用已擦除的元素,然后it的上一个值被赋予list.erase。确保在循环中执行list.erase(it++)或++it操作-这两种操作都将跳过元素并可能增加列表的末尾。
我在函数中有一个循环,它从头到尾迭代
std::list
在每个周期中,我都会对当前列表项执行一些检查和操作,在某些情况下,我希望将其从列表中删除
现在,正如预期的那样,我的迭代器失效了
- 有没有办法解决这个问题,在遍历列表时从列表中删除元素
list.erase(it++);
it
增加,因此它不再引用已擦除的元素,然后it
的上一个值被赋予list.erase
。确保在循环中执行list.erase(it++)
或++it
操作-这两种操作都将跳过元素并可能增加列表的末尾。是否考虑过使用list::remove_if
算法?捕获erase
的返回值并将其用作迭代器。返回值是删除后下一个有效位置的迭代器
if(ShouldErase)
{
iter = list.erase(iter);
}
else
{
++iter;
}
摘录:
返回值
一个双向迭代器,指向函数调用删除的最后一个元素后面的元素的新位置,如果操作删除了序列中的最后一个元素,则该位置为列表结束。“
list
s具有重要属性(…)即使删除也只会使指向被删除元素的迭代器“()”无效+1他也在操纵数据——使用remove_if很容易误导读者。如果在你的程序中可能,你可以在列表中反向迭代。