deque
(双端队列)是 C++ 标准模板库(STL)中的一种容器,全称为 "double-ended queue"。它允许我们在容器的前端和后端高效地插入和删除元素。
特点:
-
随机访问:与
vector
类似,deque
提供了对任意元素的随机访问能力,即可以通过索引直接访问元素,操作的时间复杂度为 O(1)。 -
动态大小:
deque
可以根据需要在运行时动态扩展或缩减大小。 -
高效的插入和删除操作:在
deque
的两端插入或删除元素的时间复杂度通常为 O(1)。这比如vector
在起始位置插入和删除效率要高得多,因为vector
需要移动元素来维持连续的内存。
实现方式:
deque
内部通常由多个固定大小的数组组成,这些数组的指针存储在一个中心控制器中。这种实现支持两端的快速插入和删除,而不必像 vector
那样经常重新分配整个内部数组。
应用场景:
- 需要频繁在两端添加或移除元素的场景:例如,任务队列或者工作窃取算法中,可能需要频繁地在两端添加或移除任务。
- 需要随机访问,但又比
vector
需要更多从前端插入或删除元素的场景:尽管vector
在尾部插入和删除效率非常高,但在前端的操作效率较低,此时可以考虑使用deque
。
示例:
cpp#include <iostream> #include <deque> int main() { std::deque<int> d; // 在尾部添加元素 d.push_back(10); d.push_back(20); // 在头部添加元素 d.push_front(30); d.push_front(40); // 输出: 40 30 10 20 for (int num : d) { std::cout << num << " "; } std::cout << "\n"; // 删除头部元素 d.pop_front(); // 输出: 30 10 20 // 删除尾部元素 d.pop_back(); // 输出: 30 10 // 随机访问 std::cout << "Element at index 1: " << d[1] << std::endl; // 输出: 10 return 0; }
在这个示例中,我们可以看到在 deque
的两端添加和删除元素都非常直接和高效。同时,我们还演示了如何随机访问 deque
中的元素。这展示了 deque
的灵活性和效率,使其成为在特定情况下非常有用的数据结构。
2024年7月9日 13:39 回复