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的某个接口。

相关推荐
Chester_19993 天前
CSP202312C.树上搜索
开发语言·数据结构·c++·蓝桥杯·stl
Chester_19996 天前
CSP202303C.LDAP
开发语言·c++·蓝桥杯·stl
我变成萤火虫19 天前
反悔贪心(经典题目讲解)
c++·算法·贪心算法·stl·排序算法·反悔贪心
我变成萤火虫20 天前
河南萌新联赛2026第(四)场:南阳理工学院
数据结构·c++·算法·贪心算法·stl·动态规划
峥无21 天前
从0到1手撕红黑树:封装实现 my_map 与 my_set(SGI-STL 源码级深度解析)
开发语言·c++·笔记·算法·stl
我变成萤火虫21 天前
2026 ICPC沈阳邀请赛Vp补题
数据结构·c++·算法·贪心算法·stl·排序算法·动态规划
程序喵大人23 天前
【C++进阶】STL算法与函数对象 - 09 函数对象保存状态并复用规则
开发语言·c++·算法·stl·函数对象
我变成萤火虫25 天前
河南萌新联赛2026第(三)场:郑州轻工业大学
数据结构·c++·算法·贪心算法·stl·深度优先·哈希算法
鱼子星_1 个月前
【C++】反向迭代器:反向迭代器的底层认识与模拟实现
开发语言·c++·笔记·stl
lingran__1 个月前
C++ STL map 与 set 底层剖析与模拟实现万字详解|基于红黑树,复刻 SGI-STL 泛型复用架构
开发语言·c++·stl·set·map·泛型编程·sgi-stl