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

相关推荐
小此方3 小时前
Re:从零开始的 C++ STL篇(八)深度解构AVL树自平衡机制:平衡维护与旋转调整背后的严密逻辑
开发语言·数据结构·c++·算法·stl
进击的荆棘1 天前
优选算法——链表
数据结构·算法·链表·stl
xiaoye-duck2 天前
C++ STL map 系列深度解析:从底层原理、核心接口到实战场景
开发语言·c++·stl
Hknll2 天前
CSP第33次认证题解
数据结构·c++·算法·stl·字符串·csp认证·vector/array
coding者在努力3 天前
算法竞赛中根据数据规模猜测算法
c++·算法·stl·时间复杂度
xiaoye-duck3 天前
C++ STL set 系列深度解析:从底层原理、核心接口到实战场景
开发语言·c++·stl
wWYy.3 天前
STL:map与unordered_map
开发语言·c++·stl
牢姐与蒯9 天前
vector
stl
祁同伟.13 天前
【C++】哈希的应用
开发语言·数据结构·c++·算法·容器·stl·哈希算法