priority_queue是C++ STL中基于堆的容器适配器,默认为最大堆,仅支持push、top、pop等操作;可用greater实现最小堆;自定义类型需重载operator

priority_queue 是 C++ STL 中的容器适配器,底层默认基于最大堆实现,用来高效获取当前集合中“优先级最高”的元素(比如最大值或最小值)。它不支持遍历、查找或随机访问,只提供入队(push)、出队(top + pop)、判空(empty)等基本操作。
基本声明与默认行为
默认情况下,priority_queue 是一个最大堆:每次 top() 返回的是当前最大的元素。
-
priority_queue
q; —— 存储 int,自动按降序排列(大根堆) - q.push(3); q.push(1); q.push(4); → 调用 q.top() 得到 4
- 注意:不能用 q[0] 或迭代器访问内部元素
如何实现最小堆(升序/取最小值)
只需显式指定比较器:greater
- priority_queue
, greater > min_q; - 或者更简洁写法:priority_queue
, greater> min_q; (C++14 起支持) - 此时 min_q.top() 返回最小值
自定义类型怎么用?需要重载比较逻辑
对结构体或类,必须提供比较规则。推荐方式是重载 operator,并让它表示“优先级更低”(即堆顶要的是“更大”的那个)。
立即学习“C++免费学习笔记(深入)”;
- 例如按学生分数从高到低排序,分数高者优先:
- struct Student {
string name;
int score;
bool operator};
priority_queuepq; - 如果想按姓名字典序升序排(A 在前),就写 name > b.name —— 因为 定义的是“谁该被压在下面”,不是“谁该在顶上”
常用操作和注意事项
- q.push(x) —— 插入元素,时间复杂度 O(log n)
- q.top() —— 查看堆顶(不删除),O(1)
- q.pop() —— 删除堆顶,O(log n)
- q.empty(), q.size() —— 判空和大小,都是 O(1)
- 没有 clear(),清空可循环 pop() 或直接 q = priority_queue
(); - 底层容器默认是 vector,也可换为 deque(但一般没必要)








