C++ STL常用容器的底层结构介绍
1、vector
vector又名动态数组,单口数组。其底层结构是一端连续的内存空间,即数组。最重要的特性是允许常数时间内在队尾进行插入和删除。随着元素的增加,vector在容量不足时,会执行“动态申请两倍于旧空间的新空间,将元素拷贝到新空间,然后删除旧空间”的操作已容纳新元素。vector提供迭代器,支持随机访问和遍历,重载了[]运算符。支持在任意位置进行插入和删除,但是在中间插入和删除元素会导致大量数据的移动,效率较低。
2、deque
deque又称双端数组,原因在于可以在对头和队尾进行插入和删除。deque的底层结构是动态分段连续空间,具体而言是一小段连续内存空间+多个缓冲区构成。缓冲区是用来存放数据元素的,小段内存空间内保存的是多个缓冲区的地址。和vector不同的是:1)vector只允许常数时间内在队尾进行插入和删除,而deque可以在对头和队进行插入和删除;2)deque没有容量(capacity)的概念,因为它是动态分段连续的,可以随时申请一端新空间链接起来。deque提供迭代器,支持随机访问和遍历,重载了[]运算符。
3、list
list底层结构是一个双向链表,而且是一个双向循环链表。既然是链表,那么可以在常数时间内在任意位置进行插入和删除。list不提供迭代器,不支持随机访问和遍历,也就没有重载[]运算符。因为没有提供随机存取迭代器,所以不能使用STL算法中的sort()进行排序。list自己提供排序的sort()成员函数。
4、stack
stack的规则是先进后出,它的出口和进口是同一个,这个结构导致了stack只允许三种操作,添加元素,读取栈顶元素,删除栈顶元素。除了栈顶元素以外,没有其他方式可以读取元素。stack不提供迭代器,不支持随机访问和遍历。
5、queue
queue的规则是先见先出,只允许在队尾进行插入,在对头进行删除。除了对头元素以外,没有其他方式可以读取元素。queue不提供迭代器,不支持随机访问和遍历。
6、set/multiset
set的特性是所有元素会根据其值的大小进行自动排序,其底层结构是红黑树,由于红黑树是一种平衡二叉搜索树,自动排序的效果不错,所以STL的set以红黑树为底层机制。
multiset的特性和用法与set相同,唯一的区别是set不允许排序的元素值重复。
7、map/multimap
map的特性是所有元素会根据其键值进行自动排序,每一个元素是一个对组pair,同时拥有键值和实值。pair的第一元素是键值,第二元素是实值。map底层结构是红黑树,由于红黑树是一种平衡二叉搜索树,自动排序的效果不错,所以STL的map以红黑树为底层机制。
multimap的特性和用法与map相同,唯一的区别是map不允许键值重复。正是由于这种区别,set支持[]运算符,multimap不支持[]运算符。