可能重复:
Can you remove elements from a std::list while iterating through it?
我在函数中有一个循环,从开始到结束迭代std::list
。
在每个周期中,我执行一些检查,并可能对当前列表条目进行一些操作,在某些情况下,我想从列表中删除。
现在,正如预期的那样,我的迭代器会失效。
答案 0 :(得分:14)
使用后缀增量。
list.erase(it++);
it
已增加,因此不再引用已删除的元素,因此it
的先前值将提供给list.erase
。确保你在循环中 做list.erase(it++)
或++it
- 两者都会跳过元素,并可能会超出列表的末尾。
答案 1 :(得分:14)
捕获erase
的返回值并将其用作迭代器。返回值是擦除后到下一个有效位置的迭代器。
if(ShouldErase)
{
iter = list.erase(iter);
}
else
{
++iter;
}
<强>摘录:强>
返回值
一个双向迭代器,指向函数调用擦除的最后一个元素之后的元素的新位置,如果操作擦除了序列中的最后一个元素,则该列表结束。
答案 2 :(得分:0)
您是否考虑过使用list::remove_if
算法?