首页 >后端开发 >C++ >如何在迭代时安全地从 std::list 中删除元素?

如何在迭代时安全地从 std::list 中删除元素?

DDD
DDD原创
2024-12-18 22:59:12392浏览

How to Safely Remove Elements from a std::list While Iterating?

在迭代过程中安全地从 std::list 中删除元素

问题

考虑以下代码:

for (std::list<item*>::iterator i = items.begin(); i != items.end(); i++)
{
    bool isActive = (*i)->update();
    // if (!isActive) items.remove(*i);
    // else other_code_involving(*i);
}
items.remove_if(CheckItemNotActive);

目标是在更新不活动项目后立即将其从列表中删除,从而避免第二次传递。但是,尝试使用注释掉的行删除循环中的元素会导致错误“列表迭代器不可递增”。

解决方案

在迭代期间安全删除元素的关键是遵循正确的操作顺序。应将代码修改为 while 循环,而不是上面显示的 for 循环方法,如下所示:

std::list<item*>::iterator i = items.begin();
while (i != items.end())
{
    bool isActive = (*i)->update();
    if (!isActive)
    {
        items.erase(i++);  // alternatively, i = items.erase(i);
    }
    else
    {
        other_code_involving(*i);
        ++i;
    }
}

通过首先递增迭代器 (i ),迭代器保持有效并可用于删除非活动元素。

说明

在原始 for 循环中,尝试使用 items.remove(*i) 删除元素循环体使迭代器(i)无效,导致后续迭代失败。 while 循环确保迭代器在元素被删除之前更新,从而确保其对于后续迭代的有效性。通过使用 items.erase(i ) 或 i = items.erase(i),从列表中删除适当的元素,并且迭代器会自动更新以指向下一个有效元素。

这种方法允许用于在迭代期间有效删除不活动的项目,而不需要单独遍历列表。

以上是如何在迭代时安全地从 std::list 中删除元素?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn