C++ std :: list:迭代时擦除/删除元素

Jar*_*arx 8 c++ stl list

可能重复:
你可以在迭代它时从std :: list中删除元素吗?

我在一个函数中有一个循环,它从头到尾迭代std::list.

在每个循环中,我执行一些检查,并可能对当前列表条目进行一些操作,在某些情况下,我想从列表中删除它.

现在,正如预期的那样,我的迭代器变得无效.

  • 有没有办法解决这个问题,在迭代它时从列表中删除元素?

Sio*_*vok 15

捕获返回值erase并将其用作迭代器.返回值是擦除后到下一个有效位置的迭代器.

if(ShouldErase)
{
    iter = list.erase(iter);
}
else
{
    ++iter;
}
Run Code Online (Sandbox Code Playgroud)

参考

摘抄:

返回值

一个双向迭代器,指向函数调用擦除的最后一个元素之后的元素的新位置,如果操作擦除了序列中的最后一个元素,则该列表结束.


Eri*_*rik 14

使用后缀增量.

list.erase(it++);
Run Code Online (Sandbox Code Playgroud)

it增加,所以它不再引用已擦除的元素,然后it给出之前的值list.erase.请确保您无论是list.erase(it++)还是++it在你的循环-这两项工作会跳过元素和潜在增加过去列表的末尾.