STL底层原理简介

来源:互联网 发布:哪个看书软件全部免费 编辑:程序博客网 时间:2024/05/15 06:26

sort

STL的sort()算法,数据量大时采用Quick Sort,分段递归排序。一旦分段后的数据量小于某个阈值,为避免Quick Sort的递归调用带来过大的额外开销,就改用Insertion Sort(插入排序)。如果递归层次过深,也就是说数据量过大,比如说有10亿个数,还会改用Heap Sort。

vector

底层数据结构为数组 ,变长,支持快速随机访问

array

底层数据结构为数组,定长,支持快速访问

deque(双向队列)

双端队列的数据被表示为一个分段数组,容器中的元素分段存放在一个个大小固定的数组中,此外容器还需要维护一个存放这些数组首地址的索引数组
由于分段数组的大小是固定的,并且它们的首地址被连续存放在索引数组中,因此可以对其进行随机访问,但效率比vector低很多。

向两端加入新元素时,如果这一端的分段数组未满,则可以直接加入,如果这一端的分段数组已满,只需创建新的分段数组,并把该分段数组的地址加入到索引数组中即可。无论哪种情况都不需要对已有元素进行移动,因此在双端队列的两端加入新的元素都具有较高的效率。

当删除双端队列容器两端的元素时,由于不需要发生元素的移动,效率也是非常高的。

双端队列中间插入元素时,需要将插入点到某一端之间的所有元素向容器的这一端移动,因此向中间插入元素的效率较低,而且往往插入位置越靠近中间,效率越低。删除队列中元素时,情况也类似,由于被删除元素到某一端之间的所有元素都要向中间移动,删除的位置越靠近中间,效率越低。

queue

队列,使用list或deque实现,封闭一端即可,不用vector的原因应该是容量大小有限制,扩容耗时

stack

栈,使用list或者deque实现,封闭一端即可

forward_list

单向链表,底层数据结构为链表

list

双向链表,底层数据结构为链表

set

底层数据结构为红黑树(一种二叉查找树,2-3树改进而来),有序,不重复

multiset

底层数据结构为红黑树,有序,可重复

map

底层数据结构为红黑树,有序,不重复

multimap

底层数据结构为红黑树,有序,可重复


  • iterator 只有vector和array这种支持快速随机访问的容器支持iterator+n的这种运算,其他的容器可以使用std:advance(iterator,n)
    http://www.cplusplus.com/reference/iterator/advance/
原创粉丝点击