C++ STL中的deque
deque
(双端队列)是C++标准模板库(STL)中的一个序列容器,它允许在容器的前端和后端快速插入和删除元素。与vector
相比,deque
提供了更灵活的数据结构,特别适合于需要频繁在两端操作元素的场景。
基本操作
-
创建和初始化
#include <deque> std::deque<int> d1; // 创建一个空的deque std::deque<int> d2(5, 10); // 创建一个大小为5的deque,每个元素初始化为10 std::deque<int> d3 = {1, 2, 3, 4, 5}; // 初始化列表 ```
-
访问元素
at(index)
和operator[]
:访问指定位置的元素,at
会检查索引范围。front()
和back()
:访问第一个和最后一个元素。
int first = d3.front(); // 1 int last = d3.back(); // 5 int element = d3.at(2); // 3
-
修改元素
push_back(value)
和push_front(value)
:在deque的末尾或开头添加一个元素。pop_back()
和pop_front()
:移除deque的最后一个或第一个元素。insert(position, value)
:在指定位置插入一个元素。erase(position)
或erase(start, end)
:删除一个或多个元素。clear()
:清空所有元素。
d3.push_back(6); // d3: {1, 2, 3, 4, 5, 6} d3.push_front(0); // d3: {0, 1, 2, 3, 4, 5, 6} d3.pop_back(); // d3: {0, 1, 2, 3, 4, 5} d3.pop_front(); // d3: {1, 2, 3, 4, 5} d3.insert(d3.begin() + 2, 99); // d3: {1, 2, 99, 3, 4, 5} d3.erase(d3.begin() + 2); // d3: {1, 2, 3, 4, 5}
-
大小和容量
size()
:返回当前元素的数量。resize(n)
:改变deque的大小,多出的元素会被初始化。
size_t num_elements = d3.size(); // 5 d3.resize(7, 100); // d3: {1, 2, 3, 4, 5, 100, 100}
-
遍历
- 使用范围
for
循环或迭代器。
for (int x : d3) std::cout << x << " "; for (auto it = d3.begin(); it != d3.end(); ++it) std::cout << *it << " ";
- 使用范围
相关算法
与vector
类似,deque
也可以与STL中的算法库配合使用。
-
排序
- 由于
deque
不保证所有元素在连续的内存空间,某些对内存连续性有要求的算法(如std::sort
)需要注意使用。
#include <algorithm> std::sort(d3.begin(), d3.end()); // 对deque进行排序
- 由于
-
查找
auto it = std::find(d3.begin(), d3.end(), 3); if (it != d3.end()) {std::cout << "Element found: " << *it << std::endl; }
-
计数
int count = std::count(d3.begin(), d3.end(), 3);
-
删除特定元素
- 使用
erase
和remove
组合来删除特定元素。
d3.erase(std::remove(d3.begin(), d3.end(), 3), d3.end());
- 使用
-
遍历并执行操作
std::for_each(d3.begin(), d3.end(), [](int& x){ x *= 2; });
deque
是一个非常灵活的容器,适用于需要频繁在两端插入或删除元素的场景。通过结合STL的算法,可以有效地管理和处理存储在deque
中的数据。