C++STL的list(超详解)

前言

在这里插入图片描述
看一下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然后进行排序,最后拷贝回去。
比较一下这两者之间的效率。
在这里插入图片描述

差距还是很大的。
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_68359117/article/details/134939974