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

时间:2011-03-10 20:26:23

标签: c++ list stl

  

可能重复:
  Can you remove elements from a std::list while iterating through it?

我在函数中有一个循环,从开始到结束迭代std::list

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

现在,正如预期的那样,我的迭代器会失效。

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

3 个答案:

答案 0 :(得分:14)

使用后缀增量。

list.erase(it++);

it已增加,因此不再引用已删除的元素,因此it的先前值将提供给list.erase。确保你在循环中 list.erase(it++)++it - 两者都会跳过元素,并可能会超出列表的末尾。

答案 1 :(得分:14)

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

if(ShouldErase)
{
    iter = list.erase(iter);
}
else
{
    ++iter;
}

Reference

<强>摘录:

返回值

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

答案 2 :(得分:0)

您是否考虑过使用list::remove_if算法?