list的使用及介绍

list是生成带头(哨兵位)的双向链表的类模板。由于获得某个特定节点的开销很大,需要逐个节点遍历,所以list不支持\[\]。

一.构造函数

二.迭代器

迭代器的分类:

注:1.随机就是随机访问,想访问容器里的哪个元素都可以。

2.底层结构决定性质,性质决定能够使用哪些算法。

3.list的迭代器还支持解引用:

三.erase

由于链式存储在物理上是非连续的,每个节点的地址并不是像string,vector那样是相邻的,所以想要删除某个节点,不能这么做:

同时也能明白list的迭代器的底层不是指针。

四.insert

跟上面面临同样的问题,list既然不支持"+",那么该怎样访问特定位置呢?

只能利用循环,逐个向后遍历了:

五.打印

由于list也是个类模板,数据类型是不确定的,所以实现<<的重载具有很多不确定性,因此和vector一样,它也没有<<的重载,要想打印,就需要逐个遍历。

五.assign

先将容器内数据clear掉,然后再用新数据覆盖整个容器。新数据可以传迭代器区间。

六.sort(list版)

由于算法库(algorithm)里的sort底层是快排,所以需要随机迭代器(指哪打哪),而list的迭代器是双向迭代器,没办法随机访问容器内任意节点数据,那么list就用不了算法库的sort。

list就另起炉灶单独设计了一个sort接口。默认排序是升序。

但这个接口遇到数据量大的情况时,不建议使用,效率很低。

就例如在release版本下,分别在vector和list里对1000000个数据进行排序:

解决效率低的办法:

将list里的数据用传区间的拷贝构造拷贝给vector,然后用vector里的sort接口(库里的sort)进行排序,最后用assign接口将数据拷回list。

注:很多接口传迭代器区间是写成模板的,所以可以跨容器传区间,比如list的迭代器区间就可以传给vector的某个接口。

相关推荐
峥无4 小时前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
我变成萤火虫17 小时前
2026 ICPC沈阳邀请赛Vp补题
数据结构·c++·算法·贪心算法·stl·排序算法·动态规划
程序喵大人2 天前
【C++进阶】STL算法与函数对象 - 09 函数对象保存状态并复用规则
开发语言·c++·算法·stl·函数对象
我变成萤火虫5 天前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
鱼子星_7 天前
【C++】反向迭代器:反向迭代器的底层认识与模拟实现
开发语言·c++·笔记·stl
lingran__7 天前
C++ STL map 与 set 底层剖析与模拟实现万字详解|基于红黑树,复刻 SGI-STL 泛型复用架构
开发语言·c++·stl·set·map·泛型编程·sgi-stl
我不会插花弄玉9 天前
15.map,set下:AVL树,红黑树和map,set的封装【由浅入深-C++】
c++·stl
ShineWinsu10 天前
对于C++中unordered_map的详细介绍
数据结构·c++·算法·面试·stl·哈希表·unordered_map
鱼子星_11 天前
【C++】stack和queue的应用及其模拟实现:适配器与容器适配器
数据结构·c++·笔记·stl
lingran__11 天前
C++ STL 关联式容器万字详解:set、multiset、map、multimap|接口用法 + 易错点 + 力扣真题实战
开发语言·c++·stl·set·map·红黑树·关联式容器