新闻中心

C++ priority_queue用法详解_C++优先队列自定义排序方法

2025-12-02
浏览次数:
返回列表
priority_queue是C++中基于堆的容器适配器,默认为大顶堆,可通过自定义比较器实现小顶堆或复杂类型排序,常用于Dijkstra、Huffman等算法。

c++ priority_queue用法详解_c++优先队列自定义排序方法

在C++中,priority_queue 是一个基于堆实现的容器适配器,用于维护一组元素,并始终能够快速访问最大(或最小)元素。默认情况下,它是一个大顶堆,即优先级最高的元素(最大值)位于顶部。

1. priority_queue 基本用法

头文件:

基本声明方式:

  • priority_queue<int> pq;</int>:存储整数的大顶堆
  • priority_queue<int vector>, greater<int>> pq;</int></int>:小顶堆

常用操作:

  • push(x):插入元素 x
  • top():获取堆顶元素(不删除)
  • pop():弹出堆顶元素
  • empty():判断是否为空
  • size():返回元素个数

示例代码:

#include <iostream>
#include <queue>
using namespace std;

int main() {
    priority_queue<int> pq;
    pq.push(3);
    pq.push(1);
    pq.push(4);
    pq.push(2);

    while (!pq.empty()) {
        cout << pq.top() << " ";  // 输出:4 3 2 1
        pq.pop();
    }
    return 0;
}

2. 自定义排序:基础结构体

当需要处理复杂类型(如结构体)时,可以通过重载比较函数来自定义优先级规则。

方法一:重载 operator

由于默认使用 less<t></t>,会调用 operator,所以让“优先级高的”返回 false。

struct Student {
    string name;
    int age;
    // 按年龄从小到大排,年龄小的优先级高(小顶堆效果)
    bool operator<(const Student& other) const {
        return age > other.age;  // 注意:这里反着写
    }
};

priority_queue<Student> pq;

注意:operator 返回 true 表示当前对象小于 other。但在大顶堆中,大的在上面。所以为了让年龄小的优先,必须让 age 小的对象“看起来更大”,因此写成 <code>age > other.age

3. 使用仿函数(Functor)自定义比较器

更清晰的方式是定义一个比较类,实现 operator()

struct CompareAge {
    bool operator()(const Student& a, const Student& b) const {
        return a.age > b.age;  // 年龄小的优先
    }
};

// 声明时指定第三个模板参数
priority_queue<Student, vector<Student>, CompareAge> pq;

此时,返回 true 表示 a 的优先级低于 b,即 b 应该排在前面。这和 sort 的比较函数逻辑一致:true 表示需要交换。

常见错误:误以为返回 true 是“优先”,实际上在 priority_queue 中,比较器的作用是判断谁该被放在下面。如果 cmp(a,b)==true,说明 a 的优先级比 b 低,b 应该浮到上面。

4. 使用 lambda 表达式?不行!但可以用 decltype 配合函数对象

不能直接在模板参数中使用 lambda,但可以配合 decltype 和构造函数使用:

auto cmp = [](const Student& a, const Student& b) { return a.age > b.age; };
priority_queue<Student, vector<Student>, decltype(cmp)> pq(cmp);

注意:这里必须把 cmp 作为参数传入构造函数,否则无法推导行为。

适用场景:比较逻辑复杂且只在局部使用时,这种方式更灵活。

5. 常见应用场景

  • Dijkstra 算法:取出距离最小的节点
  • Huffman 编码:合并频率最小的两棵树
  • 合并多个有序链表:用小顶堆维护每个链表的当前头节点
  • 滑动窗口最大值:可用 priority_queue 辅助实现

例如:Dijkstra 中通常这样定义:

priority_queue<pair<int, int>, vector<pair<int, int>>, greater<pair<int, int>>> pq;
// 或者自定义比较器,按距离排序
基本上就这些。关键点是理解默认是大顶堆,自定义比较器时要明确“谁优先谁靠上”,返回 true 表示第一个参数优先级更低。不复杂但容易忽略细节。

以上就是C++ priority_queue用法详解_C++优先队列自定义排序方法的详细内容,更多请关注其它相关文章!


# 多个  # 江干区网站优化推广服务  # 网络营销大面积推广  # 掇刀seo优化口碑好  # 无锡网站建设优化技术  # 绥德关键词排名优化软件  # 商丘seo网站优化推荐  # 关键词快速排名软件  # 铁岭本地网站建设流程  # 网站推广是什么技术  # 湖南网站建设怎么样  # 更大  # 可以用  # 编码  # 第一个  # 放在  # 链表  # 是一个  # 返回值  # 如何使用  # 自定义  # stream  # ios  # c++  # ai 


相关栏目: 【 科技资讯46185 】 【 网络学院92790


相关推荐: 在J*a中如何使用BigDecimal进行高精度计算_BigDecimal类应用指南  jQuery Mask 插件中实现电话号码固定前导零的教程  荒野行动PC版怎么注册_荒野行动PC版账号注册详细流程图文教程  QQ网页版官方账号入口 QQ网页版网页版登录指南  Win10磁盘清理工具在哪 Win10打开并使用磁盘清理【教程】  押井守高度称赞《辐射4》:玩了八年都停不下来!  BetterDiscord插件中安全更新用户简介的实践指南  LINUX怎么设置定时任务_LINUX crontab配置教程  一加Ace 6T支持全新明眸护眼:通过了最严苛的护眼小金标认证  qq游戏大厅官方下载_qq游戏免费下载安装入口  Python字典中优雅地迭代剩余元素的方法  Django模型中自动计算可用余额的实现方法  QQ邮箱官网登录入口 QQ邮箱网页版邮箱快速登录  J*aScript中针对特定容器内图片动画的实现教程  拷贝漫画电脑版官网入口 拷贝漫画(PC版)在线直达  蛙漫安全无毒 官方认证的绿色入口  免费抖音短视频入口_抖音网页版短视频免费通道  QQ邮箱网页版入口页面 QQ邮箱在线登录入口官网  Win11怎么查看显卡显存 Win11显示适配器属性及专用视频内存查询  Django通过AJAX异步上传图片并保存至模型的完整指南  漫蛙manwa官网登录界面_漫蛙漫画网页版主站入口  韩小圈电脑版在线入口_网页版免费登录地址  小红书商家版怎样在笔记嵌入商品卡路径_小红书商家版在笔记嵌入商品卡路径【挂载教程】  CSS Flexbox与媒体查询:实现响应式布局中元素的并排与堆叠  C++ explicit关键字防止隐式转换_C++构造函数安全规范  蛙漫2日版入口 WAMAN2(日版)无删减漫画官网链接  实现分段式页面滚动导航:CSS与J*aScript教程  在Go语言中利用后缀数组处理多字符串:实现高效文本匹配与自动补全  优化大型XML文件解析:基于Python流式处理的内存高效方案  深入理解J*a链表中的IPosition接口与使用  知音漫客官网漫画下载_知音漫客网页版阅读记录  Angular响应式表单:实现提交后表单及按钮的禁用与只读化  我的世界官方游戏入口 我的世界官网平台直达链接  怎样把文件彻底粉碎无法恢复_Windows下安全删除敏感数据【隐私保护】  b站怎么取消点赞_b站点赞取消操作方法  qq游戏手机版下载安装_qq游戏移动端入口  照顾宝贝2小游戏免费秒玩入口  利用Bokeh CustomJS动态控制DataTable列可见性  vivo手机互传视频怎么操作_vivo手机互传视频详细传输方法  Node.js中HTML按钮与J*aScript函数交互的正确姿势  c++如何使用TBB库进行任务并行_c++ Intel线程构建模块  解决Tabulator日期时间排序问题的专业指南  J*a递归快速排序中静态变量的状态管理与陷阱  谷歌邮箱注册显示错误Gmail服务器异常与延迟处理  邮政快递单号查询入口 邮政快递物流信息在线查询入口  qq游戏网页版直接玩_qq游戏免下载快速入口  蛙漫官方正版入口 蛙漫网页在线全集免费观看  如何为你的Composer包编写自动化测试_集成PHPUnit到Composer的scripts工作流  PDO预处理语句中冒号的正确处理:区分SQL函数格式与命名占位符  SteamMachine定价或为699美元 大家想入手吗? 

搜索