0

0

priority_queue如何实现自定义优先级 比较函数与运算符重载实例

P粉602998670

P粉602998670

发布时间:2025-08-04 10:34:01

|

688人浏览过

|

来源于php中文网

原创

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

priority_queue如何实现自定义优先级 比较函数与运算符重载实例

在 C++ 中使用

priority_queue
时,默认是按照数值大小来决定优先级的,但很多时候我们需要根据自定义类型或者不同的比较规则来调整优先顺序。这时候就需要我们自己定义比较方式,常见做法有两种:传入比较函数(或仿函数)重载运算符

priority_queue如何实现自定义优先级 比较函数与运算符重载实例

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

priority_queue如何实现自定义优先级 比较函数与运算符重载实例

使用比较函数或仿函数定义优先级

当你想让

priority_queue
按照某种特定规则排序,而不是默认的
<
>
运算符时,可以传入一个比较函数或仿函数(function object)。

struct Compare {
    bool operator()(int a, int b) {
        return a > b; // 小顶堆
    }
};

std::priority_queue, Compare> pq;

在这个例子中,我们通过仿函数

Compare
实现了一个小根堆(最小值先出队),因为默认是大根堆。

priority_queue如何实现自定义优先级 比较函数与运算符重载实例

如果你用的是结构体或类,也可以这样写:

struct Node {
    int val;
};

struct CompareNode {
    bool operator()(const Node& a, const Node& b) {
        return a.val > b.val; // 按 val 升序排列
    }
};

std::priority_queue, CompareNode> pq;

这种方式的好处是:

  • 灵活,可以在不同优先队列中使用不同的比较逻辑;
  • 不影响原类型的运算符定义;
  • 更清晰地表达意图,特别是当比较逻辑复杂时。

重载
<
>
运算符的方式

如果你希望某个类的对象可以直接用于

priority_queue
而不需要每次都传比较器,那就可以考虑重载它的
<
>
运算符。

比如:

struct Node {
    int val;
    bool operator<(const Node& other) const {
        return val < other.val; // 默认大顶堆
    }
};

std::priority_queue pq;

这里重载了

<
,所以默认优先队列会按
val
从大到小排序。

美图AI开放平台
美图AI开放平台

美图推出的AI人脸图像处理平台

下载

如果你想改成小顶堆呢?就不能只靠重载

<
,而是得配合前面提到的仿函数一起用了,因为默认优先队列依赖
<
判断顺序。

这种方式的优点是:

  • 写法简洁,适合一个类只有一种常用优先顺序;
  • 可读性强,一看就知道这个类型自带排序逻辑;

缺点是:

  • 如果一个类需要多种排序方式,就得写多个比较器,不太方便;
  • 修改了类的行为,可能影响其他使用该类的地方;

实际选择建议

你可以根据具体情况选择哪种方式更合适:

  • 需要多种排序方式? → 用仿函数传入比较器。
  • 类本身就应有自然排序? → 重载
    <
  • 希望代码更直观、可读性更高? → 两者都可以,看哪个更清晰。

举个例子:

你有一个任务调度系统,每个任务有个优先级和执行时间。你想按优先级排一次,又想按执行时间排一次,那显然应该写两个仿函数。

而如果你只是处理分数排名,学生类天生就应该按分数比大小,那就直接重载

<
更合适。


基本上就这些。两种方式各有优劣,实际开发中灵活选用即可。

相关专题

更多
java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1465

2023.10.24

Go语言中的运算符有哪些
Go语言中的运算符有哪些

Go语言中的运算符有:1、加法运算符;2、减法运算符;3、乘法运算符;4、除法运算符;5、取余运算符;6、比较运算符;7、位运算符;8、按位与运算符;9、按位或运算符;10、按位异或运算符等等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

228

2024.02.23

php三元运算符用法
php三元运算符用法

本专题整合了php三元运算符相关教程,阅读专题下面的文章了解更多详细内容。

85

2025.10.17

golang结构体相关大全
golang结构体相关大全

本专题整合了golang结构体相关大全,想了解更多内容,请阅读专题下面的文章。

196

2025.06.09

golang结构体方法
golang结构体方法

本专题整合了golang结构体相关内容,请阅读专题下面的文章了解更多。

189

2025.07.04

堆和栈的区别
堆和栈的区别

堆和栈的区别:1、内存分配方式不同;2、大小不同;3、数据访问方式不同;4、数据的生命周期。本专题为大家提供堆和栈的区别的相关的文章、下载、课程内容,供大家免费下载体验。

391

2023.07.18

堆和栈区别
堆和栈区别

堆(Heap)和栈(Stack)是计算机中两种常见的内存分配机制。它们在内存管理的方式、分配方式以及使用场景上有很大的区别。本文将详细介绍堆和栈的特点、区别以及各自的使用场景。php中文网给大家带来了相关的教程以及文章欢迎大家前来学习阅读。

572

2023.08.10

Go语言实现运算符重载有哪些方法
Go语言实现运算符重载有哪些方法

Go语言不支持运算符重载,但可以通过一些方法来模拟运算符重载的效果。使用函数重载来模拟运算符重载,可以为不同的类型定义不同的函数,以实现类似运算符重载的效果,通过函数重载,可以为不同的类型实现不同的操作。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

194

2024.02.23

高德地图升级方法汇总
高德地图升级方法汇总

本专题整合了高德地图升级相关教程,阅读专题下面的文章了解更多详细内容。

72

2026.01.16

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
C# 教程
C# 教程

共94课时 | 7万人学习

C 教程
C 教程

共75课时 | 4.1万人学习

C++教程
C++教程

共115课时 | 12.8万人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号