贝利信息

C++ priority_queue怎么用 C++ 优先队列自定义排序写法【堆】

日期:2026-01-26 00:00 / 作者:尼克
priority_queue默认是大根堆,要小根堆需显式指定容器和比较器:priority_queue pq;自定义排序须用仿函数类,operator()返回true表示a优先级低于b。

priority_queue 默认是大根堆(最大堆),想用小根堆或自定义排序,不能直接传 lambda,得靠仿函数或 std::greater

怎么让 priority_queue 变成小根堆

默认构造的 priority_queue 顶部是最大值;要最小值在顶,必须显式指定容器和比较器:

正确写法:

priority_queue, greater> pq;
错写成 priority_queue> 会编译失败——少了一个模板参数。

自定义结构体排序:必须写仿函数类

lambda 不能作为模板非类型参数,所以不能直接传。得定义一个可调用类型:

示例:

struct Node { int val; };
struct Compare {
bool operator()(const Node& a, const Node& b) {
return a.val > b.val; // 小根堆:val 小的在顶
}
};
priority_queue, Compare> pq;

立即学习“C++免费学习笔记(深入)”;

用 function 对象或函数指针?不推荐

理论上可以传函数指针或 std::function,但会导致运行时开销(虚调用/堆分配),且模板实例化更复杂:

真要动态改逻辑,建议封装一层,内部仍用固定仿函数 + 外部状态变量控制行为。

常见编译错误和坑

这些错几乎都源于模板参数顺序或语义理解偏差:

最易忽略的是:仿函数里的比较逻辑和直觉相反——它不是“是否应该交换”,而是“是否应该把 a 放在 b 下面”。这个反直觉点,调试时花的时间往往比写代码还多。