C++笔记9•list•

容器之list

**1.**list 的介绍

(1).list 是可以在常数范围内在任意位置进行插入和删除的序列式容器,并且该容器可以前后双向迭代。
(2).list的底层是 双向循环链表结构 ,双向链表中每个元素存储在互不相关的独立节点中,在节点中通过指针指向其前一个元素和后一个元素。
(3).优缺点
优点 :与其他的序列式容器相比 (array , vector , deque) , list 通常在任意位置进行插入、移除元素的执行效率更好。
list 最大的 缺陷 :不支持任意位置的随机访问,比如:要访问 list的第5 个元素,必须从已知的位置 ( 比如头部或者尾部 ) 迭代到该位置,在这段位置上迭代需要线性的时间开销。

2. list的使用

list官方文档介绍

构造函数、拷贝构造、析构函数、迭代器、容量空间、增删查改接口

3.list迭代器失效

迭代器失效即迭代器所指向的节点的无效,即该节 点被删除了 。因为 list 的底层结构为带头结点的双向循环链表 ,因此 list 中进行插入时是不会导致 list 的迭代 器失效的,只有在 删除 时才会失效,并且失效的只是指向被删除节点的迭代器,其他迭代器不会受到影响
注意: list迭代器的实现 与string和vector不一样,list的迭代器是将指针封装在一个结构体中,传统的只用一个指针来表示list迭代器,不足以实现list迭代器的功能,只要还是因为list是个链表,里面是一个个节点组成的,需要从堆上申请,造成 在逻辑上是连续的,在物理结构上不⼀定连续。 传统的指针++操作,就直接到下一个指针了,但是list如果单纯++,是不能指向下一个指针的,需要进行运算符重载来实现这个功能。

复制代码
void TestListIterator()
{
 int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
 list<int> l(array, array+sizeof(array)/sizeof(array[0]));
 auto it = l.begin();
 while (it != l.end())
 {
 // erase()函数执行后,it所指向的节点已被删除,因此it无效,在下一次使用it时,必须先给其赋值
 l.erase(it); 
 ++it;
 }
}

//解决方案:
void TestListIterator()
{
 int array[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
 list<int> l(array, array+sizeof(array)/sizeof(array[0]));
 auto it = l.begin();
 while (it != l.end())
 {
 // erase()函数执行后,it所指向的节点已被删除,因此it无效,erase()返回值是个迭代器 返回下一个节点的迭代器。在下一次使用it时,必须先给其赋值
 it=l.erase(it); 
 }
}

※注意:防止迭代器失效解决办法:在使用前,对迭代器重新赋值即可。

相关推荐
无限进步_37 分钟前
二叉搜索树完全解析:从概念到实现与应用场景
c语言·开发语言·数据结构·c++·算法·github·visual studio
鱼跃厂长44 分钟前
这份skill,能将你的简历提升到字节的水平!
c++·ai·ai编程
AM越.1 小时前
助睿:!!零代码解决!!订单利润分流数据加工o(* ̄▽ ̄*)ブ
数据仓库·笔记·etl·助睿
天若有情6731 小时前
逆向玩家狂喜!用C++野生写法一键破解线性加密(不规范但巨好用)
开发语言·c++·算法
咸鱼翻身小阿橙1 小时前
Qt QML调用C++注册类
java·c++·qt
魔都大虾2 小时前
旧时光里面有那些情话句子 什么比较热门
笔记
Java成神之路-2 小时前
【算法刷题笔记】全题型导航目录
笔记·算法
zhangrelay2 小时前
云课实践速通系列-基础篇汇总-必修-通识基础和专业基础-2026--工科--自动化、电气、机器人、测控等
linux·笔记·单片机·学习·ubuntu·机器人·自动化
CoderCodingNo2 小时前
【信奥业余科普】C++ 的奇妙之旅 | 19:内存的门牌号——地址与指针的设计原理
开发语言·c++