deque的基本情况:
简单的来说deque是一个双头队列。且两边的尺寸可以动态收缩或者扩张。
其底层实现相当复杂,而且效率并不高。大多数时候都不会使用。
deque诞生的原因是vector和list的优缺点不可分割。
正好复习一下vector和list的优缺点。
vector的优点:支持随机访问;尾插,尾删很方便;高速缓存命中率高。
vector的缺点:不支持头插或者中间插入;扩容具备一定的性能消耗,以及空间浪费。
list的优点:任意位置插入删除数据只需要O(1)复杂度;按需申请释放空间,没有损耗。
list的缺点:不支持随机访问,高速缓存命中率低。
对比两者的优缺点,发现他们的缺点正是为了他们的优点诞生的,两者不可分割。deque就是针对两者的缺点设计出来的,所以性能被牺牲了。
deque的底层大概是这样的结构:
如何满足随机访问?
要访问的下标,减去第一个数组具有的元素个数,然后/10,就能知道在第几个空间了。%10就能知道在第几个位置。
deque的优点:
1.头插和尾插效率不错
2.支持随机访问
3.高速缓存命中率高
4.扩容代价小
deque的缺点
1.中部插入删除效率不行,(要么需要挪动数据,要么支持每个开辟的空间大小不一定相同,这样的话,中控数组还要记录每个空间有多少个元素,因为要支持随机访问)
2.虽然支持随机访问,但效率相对于vector而言还有差距。频繁随机访问时要小心。
以排序为例(测试在release下):
用deque存数据,进行排序,和vector存数据(和deque中的内容一样),进行排序。10000以内没什么区别,之后的每个数量级,deque花费的时间都是vector的2倍左右。
如果将deque的数据拷贝进vector,进行排序,排序完再将数据拷贝给deque(用assign拷贝回deque),和直接对vector中的数据排序所花费的时间,进行比较,deque花费的时间大概是vector的1.4倍左右。
所以deque适合在大量头尾存储删除数据的时候使用,比如stack和queue,栈和队列使用deque比使用vector/list更合适。