深入理解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;
    }
相关推荐
十年一梦实验室2 分钟前
【C++】sophus : test_macros.hpp 用于单元测试的宏和辅助函数 (四)
开发语言·c++·单元测试
Irises`11 分钟前
flex自适应页面
开发语言·前端·javascript
不想当程序猿_16 分钟前
【蓝桥杯每日一题】扫描游戏——线段树
c++·算法·蓝桥杯·线段树·模拟
老猿讲编程24 分钟前
在 macOS 下安装和使用 Clang Static Analyzer
c++·macos
明月看潮生26 分钟前
青少年编程与数学 02-004 Go语言Web编程 01课题、Web应用程序
开发语言·青少年编程·编程与数学·goweb
cwtlw42 分钟前
SpringMVC的使用
java·开发语言·笔记·学习·其他
Jambo!1 小时前
Visual studio中C/C++连接mysql
c语言·c++·mysql·visual studio
Mr.131 小时前
如何实现对象的克隆?如何实现单例模式?
c++·单例模式
明月看潮生1 小时前
青少年编程与数学 02-004 Go语言Web编程 07课题、WebSockets
开发语言·青少年编程·golang·编程与数学
SoraLuna1 小时前
「Mac畅玩鸿蒙与硬件46」UI互动应用篇23 - 自定义天气预报组件
开发语言·算法·macos·ui·华为·harmonyos