Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/131.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;std::list:在迭代时擦除/删除元素_C++_List_Stl - Fatal编程技术网

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很容易误导读者。如果在你的程序中可能,你可以在列表中反向迭代。