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

C++起始之路——list


👇作者其它专栏

《数据结构与算法》《算法》《C++起始之路》


目录

1.list的介绍及使用

2.list的模拟实现

3.list与vector的对比


1.list的介绍及使用

1.1list的介绍

list的文档介绍

1.2list的使用

list中的接口比较多,一下为一些常见的重要接口

1.2.1list的构造

构造函数(constructor)接口说明
list(size_type n,const value_type& val=value_type())构造的list中包含n个值为val的元素
list()构造空的list

list(const list& x)

拷贝构造函数
list(InputIterator first,InputIterator last)用(first,last)区间中的元素构造list

1.2.2list iterator的使用

可以暂时将迭代器理解成一个指针,该指针指向list中的某个结点。

函数说明接口说明
begin+end

返回第一个元素的迭代器+返回最后一个元素下一个位置的迭代器

rbegin+rend

返回第一个元素的reverse_itrator,即end位置,返回最后一个元素下一个位置的

reverse_iterator,即begin位置

【注意】

1.begin与end为正向迭代器,对迭代器执行++操作,迭代器向后移动

2.rbegin(end)与rend(begin)为反向迭代器,对迭代器执行++操作,迭代器向前移动

1.2.3list capacity

函数声明接口说明
empty

检测list是否为空,是返回true,否则返回false

size返回list中有效结点的个数

1.2.4list element access

函数声明接口说明
front返回list的第一个结点中值的引用
back返回list的最后一个结点中值的引用

1.2.5list modifiers

函数声明接口声明
push_front在list首元素前插入值为val的元素
pop_front删除list中第一个元素
push_back在list尾部插入值为val的元素
pop_back删除list中最后一个元素
insert在list position位置中插入值为val的元素
erase删除list position位置的元素
swap交换两个list中的元素
clear清空list中的有效元素

1.2.6list的迭代器失效

上文提到,可以暂时将迭代器理解类似于指针,迭代器失效即迭代器所指向的结点无效,即该结点被删除了。因为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()){ l.erase(it++);//it=l.erase(it); } }

2.list的模拟实现

2.1模拟实现list

list的模拟实现

2.2list的反向迭代器

由上文可知,反向迭代器的++就是正向迭代器的--,反向迭代器的--就是正向迭代器的++,因此反向迭代器的实现可以借助正向迭代器,即:反向迭代器内部可以包含一个正向迭代器,对正向迭代器的接口进行包装即可。

template<class Iterator> class ReverseListIterator{ //注意: //此处typename的作用是明确告诉编译器,Ref是Iterator类中的类型,而不是静态成员变量 //否则编译器编译时就不知道Ref是Iterator中的类型还是静态成员变量 //因为静态成员变量也是按照 类名::静态成员变量名 的放式访问的 public: typedef typename Iterator::Ref Ref; typedef typename Iterator::Ptr Ptr; typedef ReverseListIterator<Iterator> Self; //构造 ReverseListIterator(Iterator it):_it(it){} //具有指针类似行为 Ref operator*(){ Iterator tmp(_it); --tmp; return *tmp; } Ptr operator->(){ return &(operator*());} //迭代器支持移动 Self& operator++(){ --_it; return *this; } Self operator++(){ Self tmp(*this); --_it; return tmp; } Self& operator--(){ ++_it; return *this; } Self& operator--(int){ Self tmp(*this); ++_it; return tmp; } //迭代器支持比较 bool operator!=(const Self& l)const { return _it!=l.it; } bool operator==(const Self& l)const { return _it==l.it; }

3.list与vector的对比

vector与list都是STL中非常重要的序列式容器,由于两个容器的底层结构不同,导致其特性以及应用场景不同,其主要不同如下:

vectorlist

动态顺序表,一段连续空间带头结点的双向循环链表

访

支持随机访问,访问某个元素效率O(1)不支持随机访问,访问某个元素效率O(N)

任意位置插入和删除效率低,需要搬移元素,时间

复杂度为O(N),插入时可能需要增容,增容:开辟新空间,拷贝元素,释放旧空间,导致效率更低

惹你一位置插入和删除效率高,不需要搬移元素,时间复杂度为O(1)

用率

底层为连续空间,不容易造成内存碎片,空间利用率高,缓存利用率高底层结点动态开辟,小结点容易造成内存碎片,空间利用率低,缓存利用率低

迭代器

原生态指针对原生态指针(结点指针)进行封装

器失效

在插入元素时,要给所有的迭代器重新赋值,因为插入元素有可能会导致重新扩容,致使原来迭代器失效,删除时,当前迭代器需要重新赋值否则会失效插入元素不会导致迭代器失效,删除元素时,只会导致当前迭代器失效,其他迭代器不受到影响

使

用场景

需要高效存储,支持随机访问,不关心插入删除效率大量插入和删除操作,不关心随机访问
http://www.jsqmd.com/news/468676/

相关文章:

  • 小迪安全|sql盲注一些知识点
  • MadLongTom
  • ✅ AI「记忆稳定层」Memory Stabilization Layer(MSL)这一层解决的是很多人遇到却解释不了的问题:❗为什么有的网站 曾经被 AI 推荐,但过一段时间又消失?
  • 进制转化类问题
  • 建筑幕墙玻璃加工案例:新启航激光打孔替代水刀,单项目降本超 50 万元
  • Windows下WSL(Ubuntu24.04)安装Nodejs
  • AI提供商配置里面,提供商类型 OpenAI 和 OpenAI-Response 有什么区别?
  • 老板问我OpenClaw、Agent、Coze、MCP、Skill有啥区别:一文看懂这些技术的差异化
  • 基于STM32的罐装水泥成分实时检测系统设计与实现(含有matlab仿真)
  • HTML5+CSS3从0到1学前端 第一节 HTML 标签语法
  • 俞敏洪入局、央企下场!双巨头押注银发康养旅游,市场按下加速键
  • Java全栈开发工程师的实战面试经历
  • 天梯赛练习(3月11日)
  • 二级圆锥圆柱齿轮减速器三维图纸及运动仿真(Proe三维+通用格式stp+仿真录像)
  • 智能风暴:2026年网络安全进入“AI对攻”时代
  • 许多水务管理者或许曾面临这样的困境:进水水质突发异常,经验丰富的老师傅凭借直觉迅速化解危机,但当老师傅退休后,这份“手感”还能留下几分?海量的实时数据涌入中控室,却难以转化为及时的调控指令——是数据不
  • 考虑综合负荷的主动配电网最优潮流计算:MATLAB实现与探索
  • 2025.03 GESP 7级 题解
  • NanoBanana2 接口接入实战:从 0 到 1 跑通调用,附完整代码示例
  • GC如何排查
  • ESP32-C6(支持 Wi-Fi 6)或 ESP32-H2 这两款和ESP32-S3的主要区别
  • 手持小型气象站:生活中的得力小助手!
  • 技术挑战盲盒
  • 腾讯版小龙虾安装体验
  • OPENCLAW连接飞书
  • STM32定时器- 核心区别:Prescaler vs. ClockDivision
  • 2026年3月上海铝艺铁艺装饰公司最新推荐榜单:铝艺围栏、庭院门、铸铝门、铝艺围栏护栏、铝艺庭院门、铝艺大门、庭院大门、铝艺围栏等领域选择指南 - 海棠依旧大
  • 搬家通知
  • Prompt、Agent、Skill、MCP、Claude Code 到底啥区别?
  • 也许是一些好题 6