STL之deque容器
1. deque容器基本概念
vector
容器是单向开口的连续内存空间,deque
则是一种双向开口的连续线性空间。所谓的双向开口,意思是可以在头尾两端分别做元素的插入和删除操作,当然,vector容器也可以在头尾两端插入元素,但是在其头部操作效率奇差,无法被接受。
deque
容器和vector
容器最大的差异,一在于deque
允许使用常数项时间对头端进行元素的插入和删除操作。二在于deque
没有容量的概念,因为它是动态的以分段连续空间组合而成,随时可以增加一段新的空间并链接起来,换句话说,像vector
那样,”旧空间不足而重新配置一块更大空间,然后复制元素,再释放旧空间”这样的事情在deque
身上是不会发生的。也因此,deque
没有必须要提供所谓的空间保留(reserve
)功能.
虽然deque
容器也提供了Random Access Iterator,但是它的迭代器并不是普通的指针,其复杂度和vector
不是一个量级,这当然影响各个运算的层面。因此,除非有必要,我们应该尽可能的使用vector,而不是deque。
注意:
对deque
进行的排序操作,为了最高效率,可将deque
先完整的复制到一个vector
中,对vector
容器进行排序,再复制回deque
.
2. deque容器实现原理
deque
容器是连续的空间,至少逻辑上看来如此,连续线性空间总是令我们联想到array
和vector
,array
无法成长,vector
虽可成长,却只能向尾端成长,而且其成长其实是一个假象,事实上是
(1) 申请更大空间
(2)原数据复制新空间
(3)释放原空间
三步骤,如果不是vector
每次配置新的空间时都留有余裕,其成长假象所带来的代价是非常昂贵的。
deque
是由一段一段的定量的连续空间构成。一旦有必要在deque
前端或者尾端增加新的空间,便配置一段连续定量