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

11

可能是重复问题:
在迭代std :: list时,是否可以从中删除元素?

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

在每次循环中,我会对当前列表条目执行一些检查,可能会进行一些操作,在某些情况下,我希望将其从列表中删除

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

  • 是否有任何方法可以解决这个问题,即在迭代std :: list时从中删除元素?

如果在您的程序中可以实现,您可以通过列表进行反向迭代。 - Juliano
3个回答

16

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

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

参考链接

摘要:

返回值

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


15

使用后缀递增。

list.erase(it++);

it被增加了,因此它不再指向已经删除的元素,然后list.erase获得it的先前值。确保在循环中只执行list.erase(it++)++it其中之一 - 两者都执行将会跳过元素并可能使迭代器超出列表末尾。


1
“List”具有重要的属性(...),即使删除操作也仅会使指向被删除元素的迭代器失效。(http://www.sgi.com/tech/stl/List.html)。+1 - Fred Foo

0
你考虑过使用 list::remove_if 算法吗?

2
他也在操作数据 - 使用remove_if可能会误导读者。 - Erik

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接