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

如何安全地迭代和删除 std::list 中的元素?

Patricia Arquette
发布: 2025-01-04 15:31:40
原创
541 人浏览过

How to Safely Iterate and Remove Elements from a std::list?

从 std::list 迭代和删除元素

在迭代 std::list 时从 std::list 中删除元素需要仔细处理避免使迭代器无效。一种常见的误解是假设在求值后立即删除元素将正确增加迭代器。但是,这种方法会导致“列表迭代器不可递增”错误。

了解迭代器行为

在 std::list 中,元素是连续分配的。当删除一个元素时,后续元素会移动以填充空出的空间。结果,最初指向被删除元素的迭代器变得无效。递增此迭代器将导致未定义的行为。

正确方法:先递增,后删除

要在迭代时正确删除元素,请采用以下策略:

  1. 先递增迭代器:使用i移动在删除任何内容之前,迭代器到下一个元素。
  2. 删除前一个元素: 使用 items.erase(i ) 删除当前位置之前的元素,其中 i 返回一个迭代器到下一个元素。或者,您可以使用 i = items.erase(i);达到相同的结果。

使用 While 循环修改代码:

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;
    }
}
登录后复制

此修改后的代码迭代列表并且:

  1. 对每个项目调用 update()。
  2. 如果该项目是不活动,删除它并将迭代器移动到下一个元素。
  3. 如果该项目处于活动状态,则执行其他代码并递增迭代器。

避免使用Remove_if方法

您的原始代码在循环后包含一个remove_if() 调用。在这种情况下,通常不鼓励使用这种方法,因为它需要额外遍历列表。如上所示,一次迭代和删除是一种更高效、更简单的解决方案。

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

本站声明
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
作者最新文章
热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板