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
相关产品推荐
相关产品推荐

