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不支持[]运算符。

  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值