文章目录
- 前言
- 构造函数
- capacity
- list的访问
- insert
- swap
- sort
前言
看一下list, 在任意位置可以进行O(1)插入删除的操作。
它怎么实现这个东西?它其实就是一个带头双向循环链表。
#成员函数
构造函数
这里面的构造函数学完string和vector之后已经相当熟悉了。
capacity
它没有resize和reserve,为什么?
它没有扩容这个玩法,它是链表。
list的访问
链表和vector、string的最大区别是什么?
它不支持【】,不能像数组一样访问。
list严格来说,要遍历和修改它,就只有一种方式,迭代器。
insert
list和vector一样,没有提供它自己的find
swap
把链表的头指针机型交换就可以了。
sort
sort很值得仔细讲一下
为什么算法库提供了一个sort,list它还要自己提供一个sort?
最主要的是算法库提供的sort,list用不了。
看算法库里面的sort做了什么事情。
这块减的时候出问题了。
算法库里面的sort是用快排实现的,快排要解决最坏的问题,就要用分数取中。
有左边和右边,直接算出中间的位置进行访问,链表不行。
迭代器的类型跟什么有关系呢?
跟容器的底层结果有关。
从功能上来说,迭代器的类型分三种。
1.单向迭代器,只能++ 不能- - ,比如单链表
2.双向迭代器,可以++, - -,比如双向链表。
3.随机迭代器,可以++,- -,+,-,比如vector, string.
要求双向可以传随机。要求单向可以传双向。
你可以认为双向是一个特殊的单向,随机也是一个特殊的单向。
基于上述的原因,也就明白list为什么有一个单独的sort.
不过链表在90%的情况下都不会用这个sort,因为它的性能不行。
list提供的sort底层用的是归并排序,归并排序本身效率也不错,但是由于种种原因。
给大家测试一下。
list当中同样的数据,一个放到直接用list提供的sort进行排序,
另一个拷贝到vector然后进行排序,最后拷贝回去。
比较一下这两者之间的效率。
差距还是很大的。