0

0

C++的std::priority_queue怎么实现最小堆_C++优先队列自定义比较器示例

下次还敢

下次还敢

发布时间:2025-11-06 16:23:31

|

844人浏览过

|

来源于php中文网

原创

默认情况下,C++的std::priority_queue是最大堆,通过使用std::greater可实现基础类型的最小堆;处理自定义类型时,需定义比较结构体,如重载operator()并返回a.age > b.age以实现按年龄升序的最小堆,注意lambda不能直接用于模板参数。

c++的std::priority_queue怎么实现最小堆_c++优先队列自定义比较器示例

默认情况下,C++ 的 std::priority_queue 是一个最大堆(即顶部元素是最大的)。如果需要实现最小堆,可以通过自定义比较器来改变其行为。

使用 std::greater 实现最小堆

最简单的方法是使用 std::greater 作为比较函数对象。适用于基础类型如 intdouble 等。

#include
#include
#include iostream>
#include // std::greater

示例代码:

std::priority_queue, std::greater> min_heap;

min_heap.push(10);
min_heap.push(5);
min_heap.push(20);

while (!min_heap.empty()) {
  std::cout   min_heap.pop();
}
// 输出: 5 10 20

自定义结构体 + 自定义比较器

当处理自定义类型时,比如结构体或类,可以定义自己的比较逻辑。

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

struct Person {
  std::string name;
  int age;
  Person(std::string n, int a) : name(n), age(a) {}
};

希望按年龄从小到大排序(最小堆),可以写仿函数(函数对象):

塔猫ChatPPT
塔猫ChatPPT

塔猫官网提供AI一键生成 PPT的智能工具,帮助您快速制作出专业的PPT。塔猫ChatPPT让您的PPT制作更加简单高效。

下载
struct CompareAge {
  bool operator()(const Person& a, const Person& b) {
    return a.age > b.age; // 注意:这里用 > 实现最小堆
  }
};

std::priority_queue, CompareAge> pq;

示例使用:

pq.push(Person("Alice", 30));
pq.push(Person("Bob", 25));
pq.push(Person("Charlie", 35));

while (!pq.empty()) {
  std::cout   pq.pop();
}
// 输出: // Bob 25 // Alice 30 // Charlie 35

Lambda 表达式不能直接用于模板参数

注意:你不能直接把 lambda 写进 priority_queue 的模板参数里,因为模板需要类型,而每个 lambda 都是唯一类型且无法命名。但可以用 std::function 包装或改用函数指针(不推荐复杂场景)。

更灵活的方式仍是使用仿函数或 struct 重载 operator()

基本上就这些。用 std::greater 快速实现基础类型的最小堆,复杂类型自己写比较结构体即可。关键点是:想让小的优先级高,就在比较中返回 a > b,这样系统认为 a 应该排在后面,从而维持堆顶最小。

相关专题

更多
string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

while的用法
while的用法

while的用法是“while 条件: 代码块”,条件是一个表达式,当条件为真时,执行代码块,然后再次判断条件是否为真,如果为真则继续执行代码块,直到条件为假为止。本专题为大家提供while相关的文章、下载、课程内容,供大家免费下载体验。

91

2023.09.25

c语言const用法
c语言const用法

const是关键字,可以用于声明常量、函数参数中的const修饰符、const修饰函数返回值、const修饰指针。详细介绍:1、声明常量,const关键字可用于声明常量,常量的值在程序运行期间不可修改,常量可以是基本数据类型,如整数、浮点数、字符等,也可是自定义的数据类型;2、函数参数中的const修饰符,const关键字可用于函数的参数中,表示该参数在函数内部不可修改等等。

527

2023.09.20

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

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

197

2025.06.09

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

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

190

2025.07.04

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

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

197

2025.06.09

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

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

190

2025.07.04

string转int
string转int

在编程中,我们经常会遇到需要将字符串(str)转换为整数(int)的情况。这可能是因为我们需要对字符串进行数值计算,或者需要将用户输入的字符串转换为整数进行处理。php中文网给大家带来了相关的教程以及文章,欢迎大家前来学习阅读。

338

2023.08.02

C++ 高级模板编程与元编程
C++ 高级模板编程与元编程

本专题深入讲解 C++ 中的高级模板编程与元编程技术,涵盖模板特化、SFINAE、模板递归、类型萃取、编译时常量与计算、C++17 的折叠表达式与变长模板参数等。通过多个实际示例,帮助开发者掌握 如何利用 C++ 模板机制编写高效、可扩展的通用代码,并提升代码的灵活性与性能。

2

2026.01.23

热门下载

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

精品课程

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

共94课时 | 7.3万人学习

C 教程
C 教程

共75课时 | 4.2万人学习

C++教程
C++教程

共115课时 | 13.3万人学习

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

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