1. 基本概念
- 定义 :
std::priority_queue
是一个容器适配器,提供基于优先级的元素访问(默认最大堆,即队首为最大元素)。 - 头文件 :
#include <queue>
- 底层容器 :默认使用
std::vector
(可替换为std::deque
)。 - 特性 :
- 元素按优先级顺序出队。
- 插入元素的时间复杂度为 O(log n),获取队首元素的时间复杂度为 O(1)。
- 不支持随机访问或遍历操作。
2. 构造函数
(1) 默认构造函数
cpp
std::priority_queue<int> pq1; // 默认底层容器为vector,比较函数为less(最大堆)
(2) 指定底层容器和比较函数
cpp
// 使用deque作为底层容器,比较函数为greater(最小堆)
std::priority_queue<int, std::deque<int>, std::greater<int>> pq2;
//因为缺省值规则的问题,所以我们必须写出底层容器才能指明建小堆
(3) 通过迭代器范围构造
cpp
int arr[] = {3, 1, 4, 1, 5};
std::priority_queue<int> pq3(arr, arr + 5); // 插入数组元素并建堆 → {5, 4, 3, 1, 1}
(4) 通过已有容器构造
cpp
std::vector<int> vec = {5, 3, 8};
std::priority_queue<int> pq4(vec.begin(), vec.end()); // 堆化为 {8, 5, 3}
3. 核心成员函数
(1) push()
插入元素并调整堆结构:
cpp
pq1.push(10); // 插入10,堆结构自动调整
(2) pop()
移除队首元素(优先级最高的元素):
cpp
pq1.pop(); // 移除当前队首元素
(3) top()
返回队首元素的常量引用(不可修改):
cpp
int max_val = pq1.top(); // 获取当前最大元素
(4) empty()
判断优先级队列是否为空:
cpp
if (pq1.empty()) { /* 处理空队列 */ }
(5) size()
返回队列中元素数量:
cpp
size_t count = pq1.size(); // 当前元素个数
4. 底层容器与比较函数
1.底层容器要求
- 必须支持
front()
、push_back()
、pop_back()
和随机访问迭代器。 - 默认使用
std::vector
,但允许替换为std::deque
(不可用std::list
)。
5. 注意事项
-
没有
clear()
方法:- 清空队列需手动循环
pop()
:
- 清空队列需手动循环
-
不可修改队首元素:
top()
返回常量引用,直接修改队首元素会破坏堆结构。
总结
std::priority_queue
适用于需要按优先级处理元素的场景(如任务调度、贪心算法、TopK问题等)。- 通过更改比较函数可实现最小堆或自定义优先级规则。