容器适配器
适配器
适配器是一种射击模式(设计模式是一套被反复使用的、多数人知晓的、经过分类编目的、代码设计经验的总结),该种模式是将一个类的接口转换成客户希望的另一个接口
STL库中的stack和queue的结构
虽然stack和queue也可以存放元素,但在STL中并没有将其划分在容器的行列,而是将其称为容器射配齐,因为stack和队列都是堆其他容器的接口进行了包装,STL中stack和queue默认使用deque,比如:
deque的介绍
deuqe双端队列:是一种双开口的连续空间的数据结构,可以在头尾两端进行插入和删除,时间复杂度为O(1),不需要移动元素,和list比较,空间利用率比较高
deque并不是真正连续的空间,而是由一段连续的小空间拼接而成的,实际deque类似于一个动态的二维数组,其底层结构如下图所示:
结构
有一个中控数组,记录了每一个数组的指针,从中间往两边存。指向的数组内根据顺序从第一个数组往后排列。头插从第一个数组最后一个位置往前插入。如果数组满了,就在中控新建一个指针,指向新创的数组
具体结构,每一个节点由四个指针,分别指向数组的当前位置,起始位置和结束位置,根据结束位置判断是否遍历当前数组结束。如果完了,node指向的中控数组找到下一个数组的node节点
优点和缺陷
与vector相比,头部插入和删除不需要移动元素,效率高。扩容也不需要挪动大量元素
与list相比,连续空间,利用高、
但是,不适合遍历,编历时,迭代器要频繁检测是否到了小段空间的边界。序列式场景,可能需要经常遍历,vector和list用的多
1.相比vector,头插头删,扩容代价低
2.支持随机访问
1.中间插入删除很难搞
2.没有vector和list的优点极致
每个buff数组不一样大,中间插入的效率变高随机访问效率就变低
每个buff固定大小,牺牲中间插入的效率,随机访问效率变高
考虑到deque的特点,更适合作为stack和queue的底层数据结构
为什么选择deque
stack是一种后进先出的特殊结构,只有尾插和尾删的惭怍,queue是先进先出的结构,尾插和头删,都可以用deque作为容器
1.stack和queue不需要遍历,只需要在固定的端进行操作
2.stack中元素增长时,deque比vector的扩容效率高,queue元素增长时,deque不仅效率高,而且内存使用率高
运用了deque的优点,避开了它的缺陷