深入理解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;
    }
相关推荐
故事和你911 分钟前
洛谷-【图论2-1】树4
开发语言·数据结构·c++·算法·动态规划·图论
故事和你914 分钟前
洛谷-【图论2-1】树1
开发语言·数据结构·c++·算法·深度优先·动态规划·图论
段ヤシ.5 分钟前
回顾Java知识点,面试题汇总Day5(持续更新)
java·开发语言
不会C语言的男孩15 分钟前
C++ SLTL编程
java·开发语言·c++
java修仙传18 分钟前
Java 实习日记:从业务表关系到节点价格分析接口改造
java·开发语言·实习
qq_4523962322 分钟前
第十四篇:《JMeter插件扩展:自定义函数与第三方插件》
开发语言·python·jmeter
敲代码的嘎仔28 分钟前
力扣高频SQL基础50题详解
开发语言·数据库·笔记·sql·算法·leetcode·后端开发
码农-阿杰30 分钟前
Java 线程等待唤醒机制深度解析:synchronized、ReentrantLock、LockSupport 底层实现对比
java·开发语言·c++
赤水无泪31 分钟前
Qt 全模块汇总列表
开发语言·qt
yong999038 分钟前
MATLAB仿真计算电磁波回波信号的技术路径与实现指南
开发语言·matlab