<deque>
数据结构
<deque>
是 C++ 标准库中的双端队列类模板,提供了在队列的两端进行高效插入和删除操作的能力。std::deque
是一种序列容器,允许在容器的两端进行快速操作,适用于需要在两端进行高效操作的场景。
1. 类介绍
std::deque
(双端队列)是一种双端容器,它允许在队列的前端和尾端进行快速的插入和删除操作。它在内部实现为多个内存块的组合,这样可以在需要时动态地扩展容量。
1.1 基本操作
创建和初始化:
#include <iostream>
#include <deque>
int main() {
// 创建一个空的 deque
std::deque<int> deq1;
// 创建一个指定大小并用默认值初始化的 deque
std::deque<int> deq2(10); // 包含 10 个 int 元素,每个元素初始化为 0
// 创建一个指定大小并用特定值初始化的 deque
std::deque<int> deq3(5, 42); // 包含 5 个 int 元素,每个元素初始化为 42
// 使用列表初始化
std::deque<int> deq4 = {1, 2, 3, 4, 5}; // 使用列表初始化
return 0;
}
访问元素:
#include <iostream>
#include <deque>
int main() {
std::deque<int> deq = {10, 20, 30, 40, 50};
// 访问元素
for (const auto& value : deq) {
std::cout << value << " ";
}
std::cout << std::endl;
// 使用 at() 函数访问元素
std::cout << "Element at index 2: " << deq.at(2) << std::endl;
return 0;
}
添加和删除元素:
#include <iostream>
#include <deque>
int main() {
std::deque<int> deq = {1, 2, 3};
// 在前面插入元素
deq.push_front(0);
// 在末尾插入元素
deq.push_back(4);
// 插入元素到指定位置
auto it = deq.begin();
++it; // 移动到第二个位置
deq.insert(it, 10); // 在第二个位置插入 10
// 删除指定位置的元素
it = deq.begin();
++it; // 移动到第二个位置
deq.erase(it); // 删除第二个位置的元素
// 删除前面和末尾的元素
deq.pop_front();
deq.pop_back();
// 清空所有元素
deq.clear();
return 0;
}
合并和排序:
#include <iostream>
#include <deque>
int main() {
std::deque<int> deq1 = {3, 1, 4, 1, 5};
std::deque<int> deq2 = {9, 2, 6, 5};
// 合并两个 deque
deq1.insert(deq1.end(), deq2.begin(), deq2.end());
// 排序 deque
std::sort(deq1.begin(), deq1.end());
// 输出合并和排序后的 deque
for (const auto& value : deq1) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
2. 高级操作
迭代器:
#include <iostream>
#include <deque>
int main() {
std::deque<int> deq = {1, 2, 3, 4, 5};
// 使用迭代器遍历
for (std::deque<int>::iterator it = deq.begin(); it != deq.end(); ++it) {
std::cout << *it << " ";
}
std::cout << std::endl;
// 使用范围-based for 循环
for (const auto& value : deq) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
反转和遍历:
#include <iostream>
#include <deque>
int main() {
std::deque<int> deq = {1, 2, 3, 4, 5};
// 反转 deque
std::reverse(deq.begin(), deq.end());
// 输出反转后的 deque
for (const auto& value : deq) {
std::cout << value << " ";
}
std::cout << std::endl;
return 0;
}
3. 总结
<deque>
提供了一个双端队列的实现,支持在容器的两端进行高效的插入和删除操作。与 std::vector
不同,std::deque
在动态扩展时不会重新分配整个容器的内存,从而在两端操作中保持高效。通过掌握 std::deque
的基本操作和高级功能,可以有效地处理需要在容器两端进行频繁操作的场景。