答案是自定义比较器可改变priority_queue排序规则,常用方法包括:1. 仿函数实现小顶堆或自定义类型排序;2. lambda配合decltype使用;3. 函数指针较少用;关键在于返回true表示第一个参数优先级更低。
在C++中,priority_queue默认使用std::less作为比较器,这意味着它是一个大顶堆(最大值优先)。如果需要改变排序规则,比如实现小顶堆或根据自定义类型排序,就需要自定义比较器。下面介绍几种常见的自定义方法。
1. 使用函数对象(仿函数)
这是最常用的方法。通过定义一个结构体或类,重载operator()。
// 小顶堆:最小值优先#include
2. 使用 lambda 表达式(需配合容器适配)
lambda 不能直接作为模板参数传入 priority_queue,但可以通过std::function和包装方式间接使用。更常见的是用函数对象或函数指针。
立即学习“C++免费学习笔记(深入)
”;
不过,可以这样写:
auto cmp = [](int left, int right) { return left > right; };std::priority_queue
C函数速查手册(CHM版)
下载注意:此时需要在构造时传入比较器实例,并使用decltype推导类型。
3. 自定义数据类型排序
对于结构体或类,也可以自定义比较逻辑。
struct Person {int age;std::string name;};struct ComparePerson {bool operator()(const Person& a, const Person& b) {return a.age > b.age;// 年龄小的优先}};std::priority_queue
4. 使用普通函数指针(较少用)
也可以定义普通函数并传入函数指针,但需要指定第三个模板参数为函数指针类型。
bool compare(int a, int b) {return a > b;}std::priority_queue
基本上就这些。关键记住:
返回 true 表示第一个参数优先级更低,会被放在后面。自定义比较器的核心是控制谁“更大”或谁该优先弹出。不复杂但容易忽略这个逻辑方向。
