deque的优缺点
deque的优缺点
- 1.vector的优点和缺点
- 1.1优点
- 1.2缺点
- 2.list的优点 和缺点
- 2.1优点
- 2.2缺点
- 什么是高速缓存命中率
- deque
- deque的优缺点
- 优点
- 缺点
前言:我们了解deque是想结合vector和list的优点来实现,但是这只是个半成品,都达不到它们优点的极致。

1.vector的优点和缺点
1.1优点
vector是数组,直接下标,迭代器访问
- 支持下标随机访问,效率高
- 支持尾插,尾删效率高
- cpu高速缓存访问命中率高,数据访问效率高
1.2缺点
- 头部和中间插入删除效率低
- 插入存在扩容,扩容有一定的性能消耗,和空间浪费。
2.list的优点 和缺点
list是链表,不会扩容,移动数据,只需要修改指针
2.1优点
- 插入和删除的效率高,不管头部,中间还是尾部
- 插入不需要扩容,按需申请释放内存。(扩容是需要 底层重新分配内容和拷贝底层数组的操作)
2.2缺点
- 不支持下标随机访问,访问数据效率低
- cpu高速缓存访问命中率低,访问数据慢。
什么是高速缓存命中率


- 对于vector【1,2,3,4】如果我们想访问1,cpu发现没有在缓存里面,然后加载vector[0]的地址和后面的块到缓存里面,后续访问,2,3,4缓存是击中的,效率就高
- 对于list的它的地址不是连续的,开始1,缓存未击中,后续访问2,3,4也要加载,效率慢
所以为什么vector的cpu访问效率高
deque
deque的结构

这是对于每个buffer都满时,访问第一个i个数据时,第x个bufferx=i/10;位置等于y=i%10.

更细节的结构
deque的优缺点
优点
- 图中看出,尾插和删除的时候如果buffer没有满可以插入位置,满了就node++,再new一个buffer,中控数组提前开好了,并不用扩容像vector那样开辟更大的空间再拷贝。头插入删除也是
- 支持下标计算访问,迭代器访问数据也还算高的。
缺点
- 对于中间插入,数组buffer的数据后移或者前移,,头插移动可能会增加一个缓冲区buffer,但是里面数据只有几个,原来的位置计算x=i/10,y=i%10,都会出现错误,还要考虑减去数。所以访问的效率没有vector高。
