1.双端队列介绍
双端队列(dequeue) 与vector很类似,采用线性表顺序存储结构,且支持随机访问,即可以直接用下标来访问元素。但与vector有区别:
- deque采用分块的线性存储结构来存储数据,每块的大小一般为512B,将之称为deque块;
- 所有的deque块使用一个map块进行管理,每个map数据项记录各个deque块的首地址,所以允许较为快速的随机访问;
即它不像vector 把所有的对象保存在一块连续的内存块,而是采用多个连续的存储块,并且在一个映射结构中保存对这些块及其顺序的跟踪; - 这样的话,deque块在头部和尾部都可以插入和删除,而不需要移动其他元素。
- 使用push_back()方法在尾部插入元素,会扩张队列;
- 使用push_front()方法在首部插入元素和使用insert()方法在中间插入元素(覆盖原有元素,不会增加新元素)。
一般来说,当考虑到容器元素的内存分配策略和操作的性能时deque相当于vector更有优势。它是vector和list的结合,复杂度处于二者之间。
操作 | 复杂度 | 说明 |
---|---|---|
push_front() | O(1) | 前插时不需要移动任何元素,他是队列,会直接往最前面插入 |
pop_front() | O(1) | |
push_back() | O(1) | |
pop_back() | O(1) | |
insert() | O(n) | |
erase() | O(n) | |
访问 | O(1) |
2.双端队列基本用法
2.1 dequeue的创建
与vector类似,deque<Type> d;
2.2 dequeue常见用法
操作 | 含义 |
---|---|
a.push_back(e) | 在尾部插入元素e,会不断扩张队列 |
a.push_front(e) | 在头部插入元素e |
a.pop_front() | 在头部删除数据 |
a.pop_back() | 在尾部删除数据 |
a.resize(num) | 重新指定队列的长度 |
a.size() | 返回容器中实际数据个数 |
a.max_size() | 返回容器中最大数据的数量 |