C++队列操作全解析
C++队列是一种遵循先进先出(FIFO)原则的容器适配器,它为标准库中的容器(如 deque或 list)提供了特定的接口操作。其核心操作包括在队尾插入元素(push),从队首移除元素(pop),访问队首和队尾元素(front和 back),以及检查队列状态(empty和 size)。
📦 1. 基本用法
使用 std::queue需包含 <queue>头文件。
#include <queue>#include <iostream>int main() {
std::queue<int> q;// 声明一个存储int类型的队列// 入队操作
q.push(10);
q.push(20);
q.push(30);
// 访问元素
std::cout << "队首元素: " << q.front() << std::endl;// 输出10
std::cout << "队尾元素: " << q.back() << std::endl;// 输出30// 出队操作
q.pop();// 移除10
std::cout << "出队后队首元素: " << q.front() << std::endl;// 输出20// 其他操作
std::cout << "队列大小: " << q.size() << std::endl;// 输出2
std::cout << "队列是否为空: " << (q.empty() ? "是" : "否") << std::endl;// 输出否return 0;
}
⚠️ 2. 重要注意事项
-
空队列访问:在调用
front()、back()或pop()之前,务必使用empty()检查队列是否为空。对空队列进行这些操作会导致未定义行为(通常引发程序崩溃) -
pop()不返回值:pop()函数仅移除队首元素,并不会返回它。如果需要获取队首元素的值,必须先调用front(),然后再调用pop()将其移除std::queue<int> q; q.push(42); // int value = q.pop(); // 错误!pop()返回voidint value = q.front();// 正确:先获取值 q.pop();// 然后再移除 -
底层容器:
std::queue默认使用std::deque作为底层容器。你也可以显式指定其他容器,但该容器必须支持back()、push_back()、front()和pop_front()操作。因此,std::list通常可以,但std::vector不行(因为它缺少pop_front()方法)#include <queue>#include <list> std::queue<int, std::list<int>> list_queue;// 使用list作为底层容器 -
无迭代器:
std::queuedeliberately 不提供迭代器,以严格遵循 FIFO 的访问原则。如果你需要遍历或检查队列中间的元素,那么queue可能不是合适的选择,应考虑使用deque或list -
多线程安全:标准库中的
std::queue本身不是线程安全的。如果需要在多线程环境中(例如生产者-消费者模型)使用队列,你必须自行使用互斥锁(std::mutex)和条件变量(std::condition_variable)等机制来同步访问,或者使用封装好的线程安全队列
🔄 3. 队列的遍历
由于队列不支持迭代器,遍历队列的唯一方式是不断取出元素直至其空。注意:这会清空原队列。
std::queue<int> temp = q;// 如果希望保留原队列,可以先创建副本while (!temp.empty()) {
std::cout << temp.front() << " ";
temp.pop();
}
🚀 4. 优先队列 (std::priority_queue)
除了标准队列,C++ 还提供了优先队列 (std::priority_queue),它位于同一个 <queue>头文件中。优先队列中的元素总是按某种优先级(默认最大元素优先级最高,即大顶堆)出队。
#include <queue>// 默认大顶堆(降序)
std::priority_queue<int> max_heap;
max_heap.push(30);
max_heap.push(10);
max_heap.push(20);
// 出队顺序将是 30, 20, 10// 创建小顶堆(升序)
std::priority_queue<int, std::vector<int>, std::greater<int>> min_heap;
min_heap.push(30);
min_heap.push(10);
min_heap.push(20);
// 出队顺序将是 10, 20, 30
🧠 5. 循环队列与数组实现
除了使用 STL,你还可以用数组手动实现队列。普通数组队列可能存在“假溢出”问题(数组前端有空间但无法使用),循环队列通过取模运算使数组在逻辑上成环,可以有效利用数组空间。
const int MAX_SIZE = 100;
int queue[MAX_SIZE];
int front = 0, rear = 0;
// 入队
queue[rear] = value;
rear = (rear + 1) % MAX_SIZE;
// 出队int value = queue[front];
front = (front + 1) % MAX_SIZE;
// 队满条件: (rear + 1) % MAX_SIZE == front// 队空条件: front == rear
💎 总结
C++ std::queue是一个简单高效的FIFO数据结构,适用于需要严格按顺序处理元素的场景,如广度优先搜索(BFS)、任务调度、缓冲区管理等。使用时请牢记:
- 安全第一:操作前用
empty()判空。 - 取值再删:先用
front()取值,再用pop()删除。 - 选择容器:了解底层容器的限制,默认
deque是均衡选择。 - 线程不安全:多线程环境下必须手动加锁。
- 遍历即销毁:遍历会清空队列,必要时操作副本。
对于需要优先级排序的场景,记得选择 std::priority_queue。
更多推荐
所有评论(0)