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

相关推荐
自信150413057593 天前
重生之从0开始学习c++之string(下)
c++·学习·stl
埃伊蟹黄面4 天前
面试常问题目 —— STL
c++·面试·职场和发展·stl
一拳一个呆瓜4 天前
【STL】文件系统导航
c++·stl
xiangyun616 天前
C++ list 模拟实现(二):const迭代器与反向迭代器,模板的黑魔法
开发语言·数据库·c++·算法·stl·list
白杨尚青6 天前
C++入门篇(十七):priority_queue 完整模拟实现——仿函数、区间建堆与指针特化(附完整代码仓库)
开发语言·c++·stl·仿函数
xiangyun618 天前
C++ list 模拟实现(一):手撕双向链表,从节点到迭代器
数据库·c++·算法·链表·stl·list
老歌老听老掉牙12 天前
基于STL模型的轴向截面轮廓提取与三维可视化方法
python·stl
白杨尚青16 天前
C++入门篇(十三):vector(上)——动态数组:构造、空间增长与迭代器失效
开发语言·c++·笔记·算法·stl
无名猿17 天前
map / set 完全指南:红黑树与有序容器
数据结构·c++·性能优化·stl·标准库
无名猿17 天前
C++ 查找算法:std::find 与容器成员 find 的性能差距
c++·性能优化·stl·标准库