C++STL的list(超详解)

文章目录

  • 前言
    • 构造函数
    • capacity
    • list的访问
    • insert
    • swap
    • sort

前言

C++STL的list(超详解)_第1张图片
看一下list, 在任意位置可以进行O(1)插入删除的操作。
它怎么实现这个东西?它其实就是一个带头双向循环链表。

#成员函数

构造函数

C++STL的list(超详解)_第2张图片
这里面的构造函数学完string和vector之后已经相当熟悉了。

capacity

C++STL的list(超详解)_第3张图片
它没有resize和reserve,为什么?
它没有扩容这个玩法,它是链表。

list的访问

链表和vector、string的最大区别是什么?
它不支持【】,不能像数组一样访问。

list严格来说,要遍历和修改它,就只有一种方式,迭代器。
C++STL的list(超详解)_第4张图片

insert

C++STL的list(超详解)_第5张图片

list和vector一样,没有提供它自己的find
C++STL的list(超详解)_第6张图片

swap

把链表的头指针机型交换就可以了。

sort

sort很值得仔细讲一下

为什么算法库提供了一个sort,list它还要自己提供一个sort?
最主要的是算法库提供的sort,list用不了。

看算法库里面的sort做了什么事情。
C++STL的list(超详解)_第7张图片
这块减的时候出问题了。
算法库里面的sort是用快排实现的,快排要解决最坏的问题,就要用分数取中。
有左边和右边,直接算出中间的位置进行访问,链表不行。

C++STL的list(超详解)_第8张图片
迭代器的类型跟什么有关系呢?
跟容器的底层结果有关。

从功能上来说,迭代器的类型分三种。

1.单向迭代器,只能++ 不能- - ,比如单链表
2.双向迭代器,可以++, - -,比如双向链表。
3.随机迭代器,可以++,- -,+,-,比如vector, string.

要求双向可以传随机。要求单向可以传双向。
你可以认为双向是一个特殊的单向,随机也是一个特殊的单向。

基于上述的原因,也就明白list为什么有一个单独的sort.
不过链表在90%的情况下都不会用这个sort,因为它的性能不行。

list提供的sort底层用的是归并排序,归并排序本身效率也不错,但是由于种种原因。
给大家测试一下。

list当中同样的数据,一个放到直接用list提供的sort进行排序,
另一个拷贝到vector然后进行排序,最后拷贝回去。
比较一下这两者之间的效率。
C++STL的list(超详解)_第9张图片

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

你可能感兴趣的:(c++,c++,list,开发语言)