当前位置: 首页 > article >正文

深入理解STL list erase

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

#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源码如下

    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;
    }

http://www.kler.cn/a/441104.html

相关文章:

  • 书生大模型实战营5
  • buu-pwn1_sctf_2016-好久不见29
  • 使用Edu邮箱申请一年免费的.me域名
  • 【重生之我在学习C语言指针详解】
  • SSM-MyBatis-总结
  • [C语言日寄] <stdio.h> 头文件功能介绍
  • ThreadLocal数据结构、内存泄漏分析
  • Maven 打包(system jar 和微服务父子项目)
  • ios系统冷知识
  • SamOutV2 0.18B模型发布
  • 接口测试常用工具 Postman
  • 基础开发工具-编辑器vim
  • PHPstudy中的数据库启动不了
  • Unity3D实现接口类的应用例子
  • STL 剖析
  • Docker:镜像操作(补充一)
  • 企业车辆管理系统(源码+数据库+报告)
  • 开源FreeSWITCH大模型智能客服系统的最佳实践
  • python 配置 oracle instant client
  • docker仓库数据传输加密
  • 通过解调使用正则化相位跟踪技术进行相位解包裹
  • java程序语言设计-反射加设计模式
  • 【使用PyQt5和YOLOv11开发电脑屏幕区域的实时分类GUI】——PyQt5在Pycharm中的安装配置
  • GCNet的简述
  • 解锁报表在线设计新高度:FastReport Online Designer 2025.1 正式上线!
  • 【C#】Debug和Release的区别和使用