c++ std::deque
std::deque
(双端队列,发音为“deck”)是 C++标准库中的一种非常灵活的数据结构。它的全称是Double-Ended Queue,允许你在队列的两端(头部和尾部)高效地插入和删除元素。std::deque
结合了数组和链表的优点,提供了快速的随机访问和高效的插入/删除操作。
1.std::deque
的特点
• 高效插入和删除:std::deque
允许在头部和尾部高效地插入和删除元素,时间复杂度为O(1)。
• 随机访问:像数组一样,std::deque
支持随机访问,可以通过索引快速访问元素,时间复杂度为O(1)。
• 动态大小:std::deque
的大小是动态的,可以根据需要自动扩展。
2.常见用法
2.1 包含头文件
在使用std::deque
之前,需要包含头文件<deque>
:
#include <deque>
2.2 初始化
你可以通过多种方式初始化std::deque
:
#include <iostream>
#include <deque>int main() {// 默认初始化std::deque<int> deque1;// 通过初始化列表初始化std::deque<int> deque2 = {1, 2, 3, 4, 5};// 指定大小和初始值std::deque<int> deque3(5, 10); // 5 个元素,每个元素初始化为 10// 从另一个 deque 复制std::deque<int> deque4(deque2);return 0;
}
2.3 插入元素
std::deque
提供了多种方法来插入元素:
#include <iostream>
#include <deque>int main() {std::deque<int> deque;// 在尾部插入元素deque.push_back(1);deque.push_back(2);// 在头部插入元素deque.push_front(0);// 在指定位置插入元素deque.insert(deque.begin() + 1, 10); // 在索引 1 的位置插入 10// 打印 deque 的内容for (int num : deque) {std::cout << num << " ";}std::cout << std::endl; // 输出:0 10 1 2return 0;
}
2.4 删除元素
std::deque
提供了多种方法来删除元素:
#include <iostream>
#include <deque>int main() {std::deque<int> deque = {0, 10, 1, 2};// 删除尾部元素deque.pop_back();// 删除头部元素deque.pop_front();// 删除指定位置的元素deque.erase(deque.begin() + 1); // 删除索引 1 的元素// 打印 deque 的内容for (int num : deque) {std::cout << num << " ";}std::cout << std::endl; // 输出:1return 0;
}
2.5 访问元素
std::deque
支持随机访问,可以通过索引访问元素:
#include <iostream>
#include <deque>int main() {std::deque<int> deque = {1, 2, 3, 4, 5};// 访问头部元素std::cout << "Front element: " << deque.front() << std::endl; // 输出:Front element: 1// 访问尾部元素std::cout << "Back element: " << deque.back() << std::endl; // 输出:Back element: 5// 通过索引访问元素std::cout << "Element at index 2: " << deque[2] << std::endl; // 输出:Element at index 2: 3// 使用 at 方法访问元素(带边界检查)std::cout << "Element at index 2: " << deque.at(2) << std::endl; // 输出:Element at index 2: 3return 0;
}
2.6 遍历
你可以使用范围for
循环或迭代器来遍历std::deque
:
#include <iostream>
#include <deque>int main() {std::deque<int> deque = {1, 2, 3, 4, 5};// 使用范围 for 循环遍历for (int num : deque) {std::cout << num << " ";}std::cout << std::endl; // 输出:1 2 3 4 5// 使用迭代器遍历for (auto it = deque.begin(); it != deque.end(); ++it) {std::cout << *it << " ";}std::cout << std::endl; // 输出:1 2 3 4 5return 0;
}
3.使用场景
std::deque
非常适合以下场景:
• 需要在两端频繁插入和删除元素:例如实现队列或栈。
• 需要随机访问元素:虽然std::deque
的随机访问性能不如std::vector
,但它仍然支持高效的随机访问。
• 动态大小:std::deque
的大小可以根据需要动态扩展,不需要预先分配固定大小。
4.总结
std::deque
是一个非常灵活的数据结构,结合了数组和链表的优点:
• 高效插入和删除:在头部和尾部的操作时间复杂度为O(1)。
• 随机访问:支持通过索引快速访问元素,时间复杂度为O(1)。
• 动态大小:可以根据需要自动扩展。
希望这些示例能帮助你更好地理解和使用std::deque
!如果有任何问题,欢迎随时问我哦。