You need to enable JavaScript to run this app. C++中如何在遍历std::list的for循环内正确删除列表元素
优惠活动
大模型
产品
解决方案
定价
更多

C++中如何在遍历std::list的for循环内正确删除列表元素

遍历std::list过程中删除元素的实现方案

你给出的原始代码存在两个核心问题:

  • 条件判断逻辑错误:i是迭代器对象,不能直接和整数8做等值比较,需要解引用取迭代器指向的存储值,正确的判断条件应该写为*i == 8
  • 直接调用remove(*i)会导致当前迭代器失效,后续循环执行i++属于未定义行为,因此会触发报错

以下是两种可正常运行的实现方式:

方式1:利用erase的返回值更新迭代器

std::list的erase()方法执行元素删除操作后,会返回被删除元素的下一个有效迭代器,我们可以直接用该返回值更新循环迭代器,不需要在删除分支手动递增迭代器,代码如下:

std::list<int> myList;
myList.push_back(5);
myList.push_back(8);
myList.push_back(8);
myList.push_back(10);

std::list<int>::iterator i;
for (i = myList.begin(); i != myList.end(); )
{
    if (*i == 8) {
        // erase返回下一个有效迭代器,直接赋值给i即可
        i = myList.erase(i);
    } else {
        // 不需要删除的场景才手动递增迭代器
        i++;
    }
}

方式2:使用std::list自带的remove_if方法(更简洁)

如果只是需要按条件删除列表元素,不需要额外添加遍历中的自定义逻辑,直接调用list自带的remove_if即可,性能和手写遍历一致,代码更简洁:

std::list<int> myList;
myList.push_back(5);
myList.push_back(8);
myList.push_back(8);
myList.push_back(10);

// 删除所有值等于8的元素,C++11及以上版本支持lambda写法
myList.remove_if([](int val) { return val == 8; });

如果是C++11之前的版本,把lambda替换为对应的自定义判断函数即可正常运行。

内容的提问来源于stack exchange,提问作者Sandu Chicu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.11 18:24:00