1. STL容器分类
- 顺序容器:序列容器。vector deque list string array
- 关联容器:set map multiset multimap unordered_set unordered_map
- 容器适配器:stack queue priority_queue
2. STL系列文章
- 记录各种C++容器的常用方法
- vector容器的使用方法见之前文章:vector容器
3. std::deque容器
3.1 头文件
#include <deque>
3.2 定义
- 双端队列,double ended queue
- 类模板
deque<T>
- 底层实现:与vector一样,都是数组实现。数据分段连续存储,通过指针数组将分散的存储块关联起来,实现整体连续。为了实现该功能,deque迭代器包含4个指针
tempalte<class T, ...>
struct DequeIte {
T* current;
T* first;
T* last;
T** node;
};
- 底层数据结构

3.3. 常用方法
和vector的操作方法很像
3.3.1 定义
方法 | 说明 |
---|
deque<int> a; | 定义一个int类型的双端队列 |
deque<int> a(10); | 初始化大小为10,初始值为0 |
deque<int> a(10, 1); | 初始化大小为10,初始值为1 |
deque<int> b(a); | 定义并用双端队列初始化b |
deque<int> b(a.begin(), a.begin() + 3); | 将a中第0~2个元素作为b初始值 |
方法 | 说明 |
---|
deq.size() | 容器元素个数 |
deq.max_size() | 最大元素个数 |
deq.resize(n, val) | 调整容器大小为n,不够的元素用val填充 |
deq.empty() | 判断容器是否为空 |
deq.shrink_to_fit() | 释放不使用的内存,改变了capacity |
方法 | 说明 |
---|
deq.push_front(const T& x) | 头部添加元素 |
deq.push_back(const T& x) | 尾部添加元素 |
deq.emplace_front(x) | 与push_front()类似,但效率更高 |
deq.emplace_back() | 与push_back()类似,但效率更高 |
deq.insert(iterator it, const T& x) | 迭代器it之前插入元素x |
deq.insert(iterator it, int n, const T& x) | 迭代器it之前插入n个相同元素 |
deq.insert(iterator it, iterator first, iterator last) | 插入另一个向量[first, last)元素 |
方法 | 说明 |
---|
deq.pop_front() | 头部元素删除 |
deq.pop_back() | 尾部元素删除 |
deq.erase(iterator it) | 任意位置删除一个元素 |
deq.erase(iterator first, iterator last) | 删除[first, last)之间的元素 |
deq.clear() | 清除所有元素 |
方法 | 说明 |
---|
deq[1] | 下标访问,不会检查是否越界 |
deq.at(1) | at会检查是否越界,是则抛出out of range异常,core dump |
deq.front() | 访问第一个元素 |
deq.back() | 访问最后一个元素 |
方法 | 说明 |
---|
deq.assign(int n, const T& x) | 类似数组初始化,赋值n个x |
deq.swap(deque&) | 交换两个同类型容器的元素 |
方法 | 说明 |
---|
deq.begin() | 开始迭代器指针,指向front()元素 |
deq.end() | 末尾迭代器指针,指向back()元素的下一个位置 |
deq.cbegin() | const begin,不能通过该迭代器来修改元素内容 |
deq.cend() | const end,末尾迭代器指针 |
deq.rbegin() | 指向back()元素 |
deq.rend() | 指向front()元素的下一个位置 |
deque<int>::iterator it;
for (it = deq.begin(); it != deq.end(); ++it) {
std::cout << *it << std::endl;
}
for (int i = 0; i < deq.size(); ++i) {
std::cout << deq.at(i) << std::endl;
}
std::reverse(deq.begin(), deq.end())
std::sort(deq.begin(), deq.end())
3.4 与vector的区别
- 都提供了非常相似的接口,可用于类似目的,但是内部以完全不同方式工作
- deque比vector复杂一些,在队列开头结尾之外的位置频繁操作性能会比较差
- vector顺序存储,deque不能保证所有元素存储在连续位置,不能用指针偏移访问
- deque没有capacity()函数;deque有push_front()/pop_front()函数而vector没有
参考文章:
deque底层结构
deque方法
created by shuaixio, 2021.06.14