【c++】list迭代器失效问题

这篇具有很好参考价值的文章主要介绍了【c++】list迭代器失效问题。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

目录

一、list iterator的使用

二、list的迭代器失效


一、list iterator的使用

        对于list的迭代器的用法,可以将它看做一个指针(实际要更加复杂)来使用,该指针指向list中的一个节点。

【c++】list迭代器失效问题,c++,开发语言

        【注意】

        (1)begin和end为正向迭代器,对迭代器执行++操作,迭代器向后移动

        (2)rbegin和rend是反向迭代器,对迭代器执行++操作,迭代器向前移动

【c++】list迭代器失效问题,c++,开发语言

二、list的迭代器失效

        list的迭代器失效即迭代器所指向的节点被删除掉了。list是带哨兵位头节点的双向循环链表,在list中进行插入节点不会导致list的迭代器失效,只有删除节点时才会出现失效问题,并且失效的只是指向被删除节点的迭代器,其他迭代器不受影响。

//list迭代器失效测试案例
void Test1()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	list<int> l(arr, arr + sizeof(arr) / sizeof(arr[0]));
	list<int>::iterator it = l.begin();
	cout << *it << endl;
	while (it != l.end())
	{
		l.erase(it);	
		it++;	//erase()函数执行后,it所指向的节点已被删除,导致it失效,所以不能再对it进行++操作
	}
}

         上面测试代码调试触发异常:"cannot increment value-initialized list iterator",(即迭代器失效)

【c++】list迭代器失效问题,c++,开发语言

        list.erase()的返回值是指向带删除节点的下一个节点的迭代器,所以为避免迭代器失效,针对上述测试代码可以做以下修改:文章来源地址https://www.toymoban.com/news/detail-819401.html

void Test2()
{
	int arr[] = { 1,2,3,4,5,6,7,8,9 };
	list<int> l(arr, arr + sizeof(arr) / sizeof(arr[0]));
	list<int>::iterator it = l.begin();
	
	while (it != l.end())
	{
		cout << *it << endl;
		l.erase(it++);	//等价于it=l.erase(it)  即用it来接收指向下一个节点的迭代器
		//erase()返回的是指向待删除节点的下一个节点的迭代器
	}
}

到了这里,关于【c++】list迭代器失效问题的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包赞助服务器费用

相关文章

  • 【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析

    【C++进阶(三)】STL大法--vector迭代器失效&深浅拷贝问题剖析

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 在阅读本篇文章前,一定要先看前集: vector深度剖析(上) 本章重点: 本章会重点讲解vector迭代器失效问题 以及vector中的深浅拷贝问题 并且简

    2024年02月11日
    浏览(28)
  • 【C++进阶(四)】STL大法--list深度剖析&list迭代器问题探讨

    【C++进阶(四)】STL大法--list深度剖析&list迭代器问题探讨

    💓博主CSDN主页:杭电码农-NEO💓   ⏩专栏分类:C++从入门到精通⏪   🚚代码仓库:NEO的学习日记🚚   🌹关注我🫵带你学习C++   🔝🔝 本质重点: 本章重点讲解list的接口函数的熟悉 并且讲解list迭代器失效的特性 最后讲解迭代器的功能分类以及 算法库函数中谁能用谁不能

    2024年02月09日
    浏览(29)
  • STL之list模拟实现(反向迭代器讲解以及迭代器失效)

    这次是关于list的模拟实现的代码,先看看下面的代码: 上面是list的代码,其底层是一个带头双向循环的链表,实现的方法就不说了,相信大家已经都会了,然后自己实心的list我没有写析构函数等,这个也很简单,循环利用成员函数中的删除函数就可以。 先来说说个人认为

    2024年02月11日
    浏览(10)
  • 【C++】vector模拟实现+迭代器失效

    【C++】vector模拟实现+迭代器失效

    铁汁们,今天给大家分享一篇vector模拟实现 + 迭代器失效,来吧,开造⛳️ 指向最后一个空间的下一个位置 💡 iterator _endofstorage 指向存储第一个有效数据空间的位置 💡 iterator _start 指向存储最后一个有效数据空间的下一个位置 💡 iterator _finish 在成员变量声明处给缺省值,

    2024年02月21日
    浏览(36)
  • 【C++】list基本接口+手撕 list(详解迭代器)

    【C++】list基本接口+手撕 list(详解迭代器)

    父母就像迭代器,封装了他们的脆弱......  手撕list目录: 一、list的常用接口及其使用 1.1list 构造函数与增删查改 1.2list 特殊接口 1.3list 排序性能分析 二、list 迭代器实现(重点+难点) 关于迭代器的引入知识: 2.1迭代器的分类 2.2 list 迭代器失效问题(和vector有差异) 2.3

    2024年02月08日
    浏览(14)
  • 【C++】手撕 list类(包含迭代器)

    【C++】手撕 list类(包含迭代器)

    目录 1,list的介绍及使用 2,list_node 3,list_node() 3,list 4,list() 5,push_back(const T x) 6,print() 7,_list_iterator 8,operator*() 9,begin() 10,end() 11,operator-() 12,operator++() 13,operator++(int) 14,operator--() 15,operator--(int) 16,operator==(const sefl s) 17,operator!=(const sefl s) 18,_list_const_iterator

    2024年02月02日
    浏览(10)
  • C++:模拟实现list及迭代器类模板优化方法

    C++:模拟实现list及迭代器类模板优化方法

    本篇模拟实现简单的list和一些其他注意的点 如下所示是利用拷贝构造将一个链表中的数据挪动到另外一个链表中,构造两个相同的链表 lt作为形参,传引用可以提高传参的效率,同时应该加上const修饰来保证不会因为不小心修改了形参导致外部的实参也被修改,这样的结果是

    2024年02月13日
    浏览(10)
  • C++:关于模拟实现vector和list中迭代器模块的理解

    C++:关于模拟实现vector和list中迭代器模块的理解

    本篇是关于 vector 和 list 的模拟实现中,关于迭代器模块的更进一步理解,以及在前文的基础上增加对于反向迭代器的实现和库函数的对比等 本篇是写于前面模拟实现的一段时间后,重新回头看迭代器的实现,尤其是在模板角度对 list 中迭代器封装的部分进行解析,希望可以

    2024年02月07日
    浏览(14)
  • C++之std::list<string>::iterator迭代器应用实例(一百七十九)

    C++之std::list<string>::iterator迭代器应用实例(一百七十九)

    简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长! 优质专栏: Audio工程师进阶系列 【 原创干货持续更新中…… 】🚀 人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药. 更多原创,欢迎关注:An

    2024年02月12日
    浏览(15)
  • 【C++】反向迭代器的模拟实现通用(可运用于vector,string,list等模拟容器)

    【C++】反向迭代器的模拟实现通用(可运用于vector,string,list等模拟容器)

    🌏博客主页: 主页 🔖系列专栏: C++ ❤️感谢大家点赞👍收藏⭐评论✍️ 😍期待与大家一起进步! 我们要写出一个通用的反向迭代器模拟而且在保证代码简介不繁琐的的情况下,一定程度上使用我们自己模拟的已经封装好的iterator迭代器可以简化许多步骤,首先我们要知

    2024年02月14日
    浏览(15)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包