- C24yechenxi's blog
proirity_queue用法
- @ 2025-10-1 16:02:07
proirity_queue
C++ STL 中的 priority_queue(优先队列)是一种特殊的队列,其元素会自动按优先级排序,每次取出的都是当前优先级最高的元素(默认是最大元素)。
基本特点:
基于堆(heap)实现,插入和提取操作的时间复杂度为 O (log n)
默认是大顶堆(最大值优先)
只能访问顶部元素,不能随机访问
基本用法示例:
运行
#include <iostream>
#include <queue> // 包含头文件
int main() {
// 1. 创建优先队列(默认大顶堆)
std::priority_queue<int> pq;
// 2. 插入元素
pq.push(30);
pq.push(10);
pq.push(50);
pq.push(20);
// 3. 访问和提取元素(每次取最大的)
while (!pq.empty()) {
std::cout << pq.top() << " "; // 访问顶部元素
pq.pop(); // 移除顶部元素
}
// 输出:50 30 20 10
return 0;
}
### 常用变种:
cpp
运行
// 小顶堆(最小值优先)
std::priority_queue<int, std::vector<int>, std::greater<int>> minPq;
// 存储自定义类型(需定义比较规则)
struct Person {
int age;
bool operator<(const Person& other) const {
return age < other.age; // 年龄大的优先级高
}
};
std::priority_queue<Person> pq;
核心接口:
push():插入元素
top():访问优先级最高的元素
pop():移除优先级最高的元素
size():获取元素个数
empty():判断是否为空
与queue的区别
优先队列和普通队列的核心区别在于元素的取出顺序,具体差异如下:
| 特性 | 普通队列(queue) | 优先队列(priority_queue) |
|---|---|---|
| 取出顺序 | 先进先出(FIFO) | 按优先级(默认最大元素先出) |
| 底层实现 | 通常基于链表或数组 | 基于堆(heap)结构 |
| 访问方式 | 只能访问队首元素 | 只能访问优先级最高的元素 |
| 插入 / 删除效率 | O(1) |
O(log n) |
| 适用场景 | 按顺序处理任务(如打印队列) | 需要动态获取最大 / 最小值的场景(如调度系统) |
简单说:
普通队列像排队买票,先到的先处理
优先队列像医院急诊,优先级高的(如病情严重的)先处理
例如,普通队列插入 [1,3,2] 后,取出顺序是 1→3→2;而优先队列会按优先级取出 3→2→1(默认大顶堆)。