gpt4 book ai didi

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

转载 作者:IT老高 更新时间:2023-10-28 22:32:03 27 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/4260891/

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