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