请升级 HydroOJ 到 4.19.0 以上版本以正常使用此插件功能。
- 分享
stl(queue)队列
- @ 2025-6-26 14:56:18
C++ std::queue 队列指南
概述
std::queue 是 C++ 标准库中的容器适配器,实现先进先出 (FIFO) 数据结构。默认基于 std::deque 实现,也可使用 std::list 作为底层容器。
1. 包含头文件
#include <queue>
2. 声明与初始化
// 默认初始化(使用 deque)
std::queue<int> myQueue;
// 指定底层容器为 list
std::queue<std::string, std::list<std::string>> listQueue;
3. 核心操作
元素入队 (push())
std::queue<int> q;
q.push(10); // 队列: [10]
q.push(20); // 队列: [10, 20]
q.push(30); // 队列: [10, 20, 30]
元素出队 (pop())
q.pop(); // 移除队首元素 → 队列: [20, 30]
访问队首元素 (front())
int front = q.front(); // 返回 20(不移除)
访问队尾元素 (back())
int back = q.back(); // 返回 30
检查队列状态
| 操作 | 示例 | 说明 |
|---|---|---|
| 判空 | if (q.empty()) { /*...*/ } |
队列为空返回 true |
| 获取大小 | size_t count = q.size(); |
返回元素数量 |
4. 使用示例
#include <iostream>
#include <queue>
int main() {
std::queue<std::string> taskQueue;
// 添加任务
taskQueue.push("Process data");
taskQueue.push("Send report");
taskQueue.push("Cleanup resources");
std::cout << "Tasks in queue: " << taskQueue.size() << "\n";
// 处理所有任务
while (!taskQueue.empty()) {
std::cout << "Executing: " << taskQueue.front() << "\n";
taskQueue.pop();
}
std::cout << "All tasks completed!\n";
return 0;
}
5. 队列特性对比
std::queue vs 数组实现队列
| 特性 | std::queue |
数组实现队列 |
|---|---|---|
| 内存管理 | 自动处理内存分配 | 需手动管理内存 |
| 扩容机制 | 动态扩容 | 固定大小或需手动扩容 |
| 并发安全 | 非线程安全 | |
| 底层实现 | 基于 deque/list | 基于原始数组 |
| 边界检查 | 内置安全检测 | 需手动实现检查 |
| 代码复杂度 | 低(标准库实现) | 高(需自行实现) |
std::queue vs std::deque
| 特性 | std::queue |
std::deque |
|---|---|---|
| 访问模式 | 仅限 FIFO 操作 | 支持随机访问 |
| 接口复杂度 | 简单(6个方法) | 复杂(多种操作) |
| 使用场景 | 严格 FIFO 需求 | 需双端操作/随机访问 |
| 性能 | 适配器层轻微开销 | 直接操作最优 |
6. 最佳实践
-
选择底层容器:
- 默认使用
std::deque(综合性能好) - 频繁小数据操作考虑
std::list
std::queue<int, std::list<int>> listBasedQueue; - 默认使用
-
安全访问:
// 先检查再访问 if (!myQueue.empty()) { auto value = myQueue.front(); myQueue.pop(); } -
遍历队列(非破坏性):
std::queue<int> temp = myQueue; while (!temp.empty()) { std::cout << temp.front() << " "; temp.pop(); } -
错误处理:
try { if (myQueue.empty()) throw std::runtime_error("Accessing empty queue"); // 安全操作... } catch (const std::exception& e) { std::cerr << "Error: " << e.what() << std::endl; }
复杂度分析
| 操作 | 时间复杂度 | 说明 |
|---|---|---|
push() |
O(1) | 常量时间插入 |
pop() |
常量时间移除 | |
front()/back() |
常量时间访问 | |
size()/empty() |
常量时间查询 |
应用场景:任务调度、消息处理系统、BFS 算法、缓冲区管理、打印队列等需要 FIFO 机制的场合。
0 条评论
目前还没有评论...