在c++++中使用priority_queue时,若需自定义优先级排序,主要有两种方法:传入比较函数(或仿函数)和重载运算符。1. 使用仿函数方式更灵活,适合不同优先队列需要不同比较逻辑的场景,例如定义一个compare结构体重载operator()来实现小顶堆或根据结构体成员排序;2. 重载<或>运算符则适合类本身具有自然排序的场景,写法简洁且可读性强,但不便于支持多种排序方式。实际开发中应根据需求选择:需要多种排序方式时用仿函数,类有自然排序时重载运算符,希望代码直观时两者皆可。

在 C++ 中使用
priority_queue

下面我们就来看怎么实现这两种方法,以及它们分别适合什么场景。

当你想让
priority_queue
<
>
struct Compare {
bool operator()(int a, int b) {
return a > b; // 小顶堆
}
};
std::priority_queue<int, std::vector<int>, Compare> pq;在这个例子中,我们通过仿函数
Compare

如果你用的是结构体或类,也可以这样写:
struct Node {
int val;
};
struct CompareNode {
bool operator()(const Node& a, const Node& b) {
return a.val > b.val; // 按 val 升序排列
}
};
std::priority_queue<Node, std::vector<Node>, CompareNode> pq;这种方式的好处是:
<
>
如果你希望某个类的对象可以直接用于
priority_queue
<
>
比如:
struct Node {
int val;
bool operator<(const Node& other) const {
return val < other.val; // 默认大顶堆
}
};
std::priority_queue<Node> pq;这里重载了
<
val
如果你想改成小顶堆呢?就不能只靠重载
<
<
这种方式的优点是:
缺点是:
你可以根据具体情况选择哪种方式更合适:
<
举个例子:
你有一个任务调度系统,每个任务有个优先级和执行时间。你想按优先级排一次,又想按执行时间排一次,那显然应该写两个仿函数。
而如果你只是处理分数排名,学生类天生就应该按分数比大小,那就直接重载
<
基本上就这些。两种方式各有优劣,实际开发中灵活选用即可。
以上就是priority_queue如何实现自定义优先级 比较函数与运算符重载实例的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号