双端队列在 STL 中的实现方式
双端队列在 STL 中的实现方式是使用一个数组,数组里的每个元素都指向一段固定大小的内存(默认使 512kb)的开始位置。
当一段内存空间用完的时候,会再申请一段同样大小的新内存空间接在现在内存空间后面,然将这段新内存空间的开始位置记录到上面说的数组中。
双端队列相比数组,有两个优势:
- 扩容成本低,假设已经存了 10000 个元素,数组要重新复制这 10000 个元素,而队列可能只要复制 100 个元素(100 × 100)
- 内存利用率高,同样 10000 个元素,当内存中没有这么一大块连续内存的时候,数组可能失败,而队列可以利用各种小的零散空间
有优势就有劣势,双端队列的迭代控制更复杂,首先程序得知道队列的头和尾分别在哪个内存空间的哪个位置,然后当头或尾存在的内存空间只有 1 个元素,你把它删了,程序又得知道下面应该指向哪块内存空间的头或尾的位置
PS:在 STL 中,栈是通过适配器模式基于队列(deque)实现的。为什么不用数组(vector)来实现,原因就是上面提到的扩容代价比较大。