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中的数据。