gpt4 book ai didi

c++ - 当我迭代它时,我可以从 std::list 中删除元素吗?

转载 作者:太空宇宙 更新时间:2023-11-04 12:43:55 24 4
gpt4 key购买 nike

当我迭代它时,我可以从 std::list 中删除元素吗?例如:

std::list<int> lst;
//....
for (std::list<int> itr = lst.begin(); itr != lst.end(); itr++)
{
if (*itr > 10)
lst.remove(*itr);
}

?为什么?

最佳答案

正确的代码如下:

for (std::list<int>::iterator itr = lst.begin(); itr != lst.end(); /*nothing*/)
{
if (*itr > 10)
itr = lst.erase(itr);
else
++itr;
}

当你从列表中删除一个项目时,你可能会使迭代器无效(如果它指向被删除的项目。)因此你需要使用 erase 来删除(它返回一个有效的迭代器指向下一项)。

更好的主意是使用 std::remove_if :

bool greater_than_10(int x)
{
return x > 10;
}

lst.remove_if(greater_than_10);

如果你的编译器支持lambdas ,你可以把它写得更短:

lst.remove_if([](int x){ return x > 10; });

(我没有测试这段代码,因为我的编译器不是那么新;谢天谢地,lambda 函数是从@John Dibling 的回答中偷来的。)


实际上,从列表中删除会使 only the iterators pointing to the item being deleted 无效.但是请注意,其他 STL 容器没有此属性。


所以,简而言之:一般来说,您不应该在遍历列表时从列表中删除项目,因为删除可能会使迭代器失效(并且程序可能会崩溃)。但是,如果您完全确定您删除的项目不是您在删除时使用的任何迭代器引用的值,您可以删除。

请注意,对于其他 STL 容器(例如 vector ),约束更为严格:从容器中删除不仅会使指向已删除项的迭代器失效,而且可能还会使其他迭代器失效!因此,在遍历这些容器时从这些容器中删除就更成问题了。

关于c++ - 当我迭代它时,我可以从 std::list 中删除元素吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52657886/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com