【C++ STL】 容器详解:queue 学习
在 C++ STL(标准模板库)中,queue
是一个 FIFO(先进先出) 的顺序容器,适用于 排队处理 场景,如任务调度、数据缓冲等。它基于 双端队列(deque) 实现,提供了高效的插入和删除操作。
1. queue
的基本特点
-
先进先出(FIFO):新元素入队(
push
),旧元素先出队(pop
)。 -
底层实现:通常基于 双端队列(deque)。
-
受限的访问:
queue
只允许在队尾插入元素,在队头移除元素,不支持随机访问。 -
时间复杂度:入队(
push
)和出队(pop
)操作的时间复杂度均为O(1)
。
2. queue
的基本用法
2.1 queue
的定义与初始化
以下是一些常见的定义方式:
queue<int> q1; // 定义一个空的queue,存储int类型的元素
queue<int> q2(q1); // 使用另一个queue初始化
#include <iostream>
#include <queue>
using namespace std;
int main() {
queue<int> q;
// 入队
q.push(10);
q.push(20);
q.push(30);
// 访问队头元素
cout << "队头: " << q.front() << endl;
return 0;
}
输出:
队头: 10
2.2 入队与出队(插入和删除)
可以使用push
方法向queue
中插入元素。新元素会被添加到队尾。
可以使用pop
方法从queue
中移除队头元素。注意,pop
方法不会返回被移除的元素。
queue<int> q;
q.push(10); //入队10
q.push(20); //入队20
q.push(30); //入队30
q.pop(); // 移除队头元素10
2.3 访问队头和队尾元素
可以使用front
方法访问队头元素,使用back
方法访问队尾元素。
cout << "队头: " << q.front() << endl;
cout << "队尾: " << q.back() << endl;
queue<int> q;
q.push(10);
q.push(20);
q.push(30);
cout << "Front element: " << q.front() << endl; // 输出: 10
cout << "Back element: " << q.back() << endl; // 输出: 30
2.4 检查队列是否为空
if (q.empty()) {
cout << "队列为空" << endl;
}
2.5 获取队列大小
cout << "队列大小: " << q.size() << endl;
3. queue
的应用场景
-
任务调度:操作系统中的 任务队列,按顺序处理任务。
queue
遵循先进先出的原则,最先插入的元素最先被移除。这使得queue
非常适合用于任务调度、消息队列等场景。queue<int> q; q.push(10); q.push(20); q.push(30); while (!q.empty()) { cout << q.front() << " "; q.pop(); } // 输出: 10 20 30
-
受限的访问:
queue
只允许在队尾插入元素,在队头移除元素,不支持随机访问。如果需要随机访问,可以考虑使用deque
或vector
。 -
queue
是一个容器适配器,它基于其他容器(如deque
或list
)实现。默认情况下,queue
基于deque
实现,但也可以指定其他容器。queue<int, list<int>> q; // 基于list实现的queue
-
数据缓冲:消息队列、IO 任务处理。
-
广度优先搜索(BFS):遍历树或图的常用工具。
4. queue
与 priority_queue
、deque
的区别
特性 | queue | priority_queue | deque |
---|---|---|---|
底层结构 | 双端队列(deque) | 堆(heap) | 双端队列(deque) |
元素顺序 | 先进先出(FIFO) | 按优先级出队 | 两端均可操作 |
插入/删除复杂度 | O(1) | O(log n) | O(1) |
适用场景 | 普通队列 | 任务调度、优先级处理 | 需要两端操作的场景 |
总结
queue
是 C++ STL 中的 先进先出 顺序容器,适用于 任务管理、数据缓冲和 BFS 等场景。如果需要按照优先级出队,可以使用 priority_queue
,如果需要两端操作,可以使用 deque
。