- 分享
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 条评论
目前还没有评论...