深入理解STL list erase

1、list erase后,当前的迭代器失效,返回指向下一个节点的迭代器

cpp 复制代码
#include<list>
#include<iostream>
#include<vector>
using namespace std;

int main()
{
	list<int> ls;
	ls.push_back(1);
	ls.push_back(2);
	ls.push_back(3);
	list<int>::iterator it = ls.begin();
	for ( it = ls.begin(); it != ls.end();)
	{
		if (*it == 2)
		{
			ls.erase(it);
		}
		else
		{
			cout << *it << endl;
			it++;
		}
	}

	return 0;
}

ls.erase(it);后,it失效,再对其进行++将会导致软件崩溃,erase后返回一个新的有效的迭代器 it = ls.erase(it);才是正确的

list erase源码如下

cpp 复制代码
    iterator erase(const const_iterator _Where) noexcept /* strengthened */ {
#if _ITERATOR_DEBUG_LEVEL == 2
        _STL_VERIFY(_Where._Getcont() == _STD addressof(_Mypair._Myval2), "list erase iterator outside range");
#endif // _ITERATOR_DEBUG_LEVEL == 2
        const auto _Result = _Where._Ptr->_Next;
        //销毁当前节点
        _Node::_Freenode(_Getal(), _Mypair._Myval2._Unlinknode(_Where._Ptr));
        //返回一个新的迭代器
        return _Make_iter(_Result);
    }
    _Nodeptr _Unlinknode(_Nodeptr _Pnode) noexcept { // unlink node at _Where from the list
        _Orphan_ptr2(_Pnode);
        _Pnode->_Prev->_Next = _Pnode->_Next;
        _Pnode->_Next->_Prev = _Pnode->_Prev;
        --_Mysize;
        return _Pnode;
    }
相关推荐
阿里嘎多学长4 小时前
2026-04-11 GitHub 热点项目精选
开发语言·程序员·github·代码托管
yugi9878384 小时前
基于最大信息熵的粒子群优化算法图像分割(MATLAB实现)
开发语言·算法·matlab
yaoxin5211234 小时前
376. Java IO API - 使用 Globbing 和自定义 Filter 过滤目录内容
java·开发语言·python
Mr YiRan4 小时前
JNI技术之手写JNIEnv与静态缓存与native异常
java·c++
飞翔的SA4 小时前
全程 Python:无需离开 Python 即可实现光速级 CUDA 加速,无需c++支持
开发语言·c++·python·nvidia·cuda
SccTsAxR4 小时前
算法进阶:贪心策略证明全攻略与二进制倍增思想深度解析
c++·经验分享·笔记·算法
冰暮流星4 小时前
javascript之dom访问css
开发语言·javascript·css
北风toto4 小时前
java进制转换方法
java·开发语言·python
CoderMeijun4 小时前
CMake 入门笔记
c++·笔记·编译·cmake·构建工具
楼田莉子4 小时前
设计模式:创建型设计模式简介
服务器·开发语言·c++·设计模式