c++中priority_queue的应用及模拟实现
1.介绍
priority_queue 是一种数据结构,它允许你以特定的顺序存储和访问元素。在 C++ 标准模板库(STL)中,priority_queue 是一个基于容器适配器的类模板,它默认使用 std::vector 作为底层容器,并且默认使用最大堆来存储元素。priority_queue 中的元素按照优先级顺序排列。默认情况下,优先级最高的元素(即值最大的元素)位于队列的顶部。访问时,只能访问优先级最高的元素(即队列顶部的元素),不能直接访问其他元素。
2.代码体验
测试代码:
#include<vector>
#include<queue>
#include<iostream>
using namespace std;
int main()
{priority_queue<int> pq;pq.push(20);pq.push(5);pq.push(60);pq.push(80);pq.push(3);while (!pq.empty()){cout << pq.top() << " ";pq.pop();}cout << endl;return 0;
}
运行结果如下:

结果证明,元素确实是按大根堆的形式存储的!
3.自定义比较函数
priority_queue除了直接用于排序元素之外,还能用于自定义比较函数,来改变元素的优先级顺序例如,如果你想让优先队列按照元素的某个属性排序,可以定义一个比较函数
代码示例:
class date
{friend ostream& operator<<(ostream& _cout, const date& d);
public:date(int year=2025,int month=1,int day=1):_year(year),_month(month),_day(day){}bool operator<(const date& d)const{return (_year < d._year) ||(_year == d._year && _month < d._month) ||(_year == d._year && _month == d._month && _day == d._day);}bool operator>(const date& d)const{return (_year > d._year) ||(_year == d._year && _month > d._month) ||(_year == d._year && _month == d._month && _day > d._day);}
private:int _year;int _month;int _day;
};
ostream& operator<<(ostream& _cout, const date& d)
{_cout << d._year << " " << d._month << " " << d._day;return _cout;
}int main()
{priority_queue<date, vector<date>, greater<date>> q1;//解释一下这里为什么要写三个参数,而之前的应用为什么写一个参数就可://这是由于priority_queue的模板就是这样给的,(详见下方图片),由于我们要进行//日期的某种排序,需要把第三个参数写上,而c++规定,你要写第三个参数 前面的第二个就必须写//所以我们第二个参数要写上!q1.push(date(2025, 1, 27));q1.push(date(2024, 10, 6));q1.push(date(2025, 5, 8));while (!q1.empty()){cout<< q1.top()<<endl;q1.pop();}return 0;
}

运行结果如下:

那个比较函数我们也可以自己来写,也支持的!
class date
{friend ostream& operator<<(ostream& _cout, const date& d);
public:date(int year=2025,int month=1,int day=1):_year(year),_month(month),_day(day){}bool operator<(const date& d)const{return (_year < d._year) ||(_year == d._year && _month < d._month) ||(_year == d._year && _month == d._month && _day == d._day);}bool operator>(const date& d)const{return (_year > d._year) ||(_year == d._year && _month > d._month) ||(_year == d._year && _month == d._month && _day > d._day);}
private:int _year;int _month;int _day;
};
ostream& operator<<(ostream& _cout, const date& d)
{_cout << d._year << " " << d._month << " " << d._day;return _cout;
}
int main()
{priority_queue<date, vector<date>> q2;q2.push( date(2025, 1, 27));q2.push( date(2024, 10, 6));q2.push( date(2025, 5, 8));while (!q2.empty()){cout << q2.top() << endl;q2.pop();}return 0;
}
结果如下:

我们也可以写一个比较函数来进行比较
比较函数参数:
struct lessdate //自定义一个比较函数
{bool operator()(date* p1, date* p2){return *p1 < *p2;}
};
main函数也要变一下:
int main()
{priority_queue<date*, vector<date*>, lessdate> q2;q2.push(new date(2025, 1, 27));q2.push(new date(2024, 10, 6));q2.push(new date(2025, 5, 8));while (!q2.empty()){cout << *q2.top() << endl;q2.pop();}return 0;
}
解释一下这里为什么要new一下,我们的q2是指针, 存储的是指针而不是对象,通过创建一个对象,并将其地址推入q2中,所以要new一下,此外,我们还要加一个比较函数,如果不加直接比的话,就是按照地址的大小来确定输出了,而与输入内容的大小无关了!
注:若比较函数参数不是指针,而是date p1,date p2,那main函数就不需要new date了!
4.模拟实现priority_queue
由于其默认使用最大堆来存储元素,因此我们在模拟实现时2,务必要涉及到堆的相关算法,如向上调整算法以及向下调整算法,如有遗忘可以找我之前的博客看一下,在本篇我也会略作讲解
1)基本框架:
#include<vector>
namespace rens
{template<class T>class less{public:bool operator()(const T& x, const T& y){return x < y;}};template<class T>class greater{public:bool operator()(const T& x, const T& y){return x > y;}};template<class T,class container ,class compare>class priority_queue{public:private:container _con;};
}
插入数据:和二叉树,堆一样,先将插入的数据放在最下面的叶结点,在逐步向上调整,以达到最大堆的结构
删除数据:不要直接将最上面的删去,这样会造成这棵树“辈分混乱、群龙无首”,应先将最上面的数与最后一个数据交换,在向下调整,调整完毕后,删去最后一个数据
整体代码实现:
#include<vector>
#include <iostream>
namespace rens
{template<class T>class less{public:bool operator()(const T& x, const T& y){return x < y;}};template<class T>class greater{public:bool operator()(const T& x, const T& y){return x > y;}};template<class T,class container=std::vector<T> ,class compare=less<T>>class priority_queue{public:void adjust_up(size_t child){compare com;size_t parent = (child - 1) / 2;while (child > 0){if (com(_con[parent], _con[child])){std::swap(_con[child], _con[parent]); //我们要排大堆,大的往上走child = parent;parent = (child - 1) / 2;}else {break;}}}void push(const T& x){_con.push_back(x);adjust_up(_con.size() - 1);}void adjust_down(size_t parent){compare com;size_t child = parent * 2 + 1;while (child < _con.size()){//先找最小孩子if (child + 1 < _con.size() && com(_con[child], _con[child + 1])){++child;}if (com(_con[parent], _con[child])){std::swap(_con[child], _con[parent]);parent = child;child = parent * 2 + 1;}else{break;}}}void pop(){std::swap(_con[0], _con[_con.size() - 1]);_con.pop_back();adjust_down(0);}T& top(){return _con[0];}size_t size(){return _con.size();}bool empty(){return _con.empty();}private:container _con;};
}
代码测试:
#include"priority_queue.h"
#include<iostream>
using namespace std;
//小的优先级高int main()
{cout << "升序" << endl;rens::priority_queue<int, std::vector<int>, rens::greater<int>> pq;pq.push(2);pq.push(5);pq.push(4);pq.push(1);pq.push(50);while (!pq.empty()){std::cout << pq.top()<<" ";pq.pop();}cout << endl << "降序"<<endl;//默认是最大的,因为我们默认参数给的是Lessrens::priority_queue<int, std::vector<int>> pq1;pq1.push(2);pq1.push(5);pq1.push(4);pq1.push(120);pq1.push(1);while (!pq1.empty()){cout << pq1.top()<<" ";pq1.pop();}cout << endl;return 0;
}
5.仿函数
在 C++ 中,仿函数(Functor)是一种重载了函数调用操作符 operator() 的类或结构体。仿函数可以像函数一样被调用,但它们实际上是对象。仿函数通常用于定义特定行为,它们可以被传递给算法,如 std::sort 或 std::for_each,以自定义这些算法的行为。
#include<vector>
#include <iostream>
namespace rens
{template<class T>class less{public:bool operator()(const T& x, const T& y){return x < y;}};
}
bool lessfunc(int x, int y)
{return x < y;
}
int main()
{bool (*ptr)(int, int) = lessfunc;rens::less<int> lessfunc;cout << lessfunc(1, 2) << endl;
}
相关文章:
c++中priority_queue的应用及模拟实现
1.介绍 priority_queue 是一种数据结构,它允许你以特定的顺序存储和访问元素。在 C 标准模板库(STL)中,priority_queue 是一个基于容器适配器的类模板,它默认使用 std::vector 作为底层容器,并且默认使用最…...
深度学习篇---计算机视觉任务模型的剪裁、量化、蒸馏
文章目录 前言第一部分:计算机视觉任务图像分类特点 图像识别特点 目标检测特点 图像分割子任务特点 第二部分:模型剪裁、量化、蒸馏模型剪裁1.权重剪裁2.结构剪裁3.迭代剪裁 模型量化1.对称量化2.非对称量化3.动态量化4.静态量化 知识蒸馏1.训练教师网络…...
java-关键字(final,static)
关键字 final 和 static 是两个常用的关键字,它们分别用于不同的场景,具有不同的作用。 final final 关键字用于表示某个实体是不可变的。它可以应用于变量、方法和类。 final 变量 当 final 用于变量时,表示该变量一旦被初始化后&#…...
游戏引擎 Unity - Unity 设置为简体中文、Unity 创建项目
Unity Unity 首次发布于 2005 年,属于 Unity Technologies Unity 使用的开发技术有:C# Unity 的适用平台:PC、主机、移动设备、VR / AR、Web 等 Unity 的适用领域:开发中等画质中小型项目 Unity 适合初学者或需要快速上手的开…...
JDK17主要特性
JDK 17,也被称为Java 17或Java Platform, Standard Edition 17,是Java编程语言的第十七个主要版本,由Oracle公司在2021年9月发布。Java 17是一个长期支持(LTS,Long-Term Support)版本,这意味着它…...
将OneDrive上的文件定期备份到移动硬盘
背景: 我在oneDrive上存了很多文件,分布在多个文件夹中,也有套了好几层文件夹的情况。我希望每隔一段时间,将oneDrive上的所有文件向移动硬盘上拷贝一份,但是我只想将距离上一次向移动硬盘拷贝的文件相比,发…...
【Elasticsearch】geohex grid聚合
在 Elasticsearch 中,地理边界过滤是一种用于筛选地理数据的技术,它可以根据指定的地理边界形状(如矩形、多边形等)来过滤符合条件的文档。这种方法在地理空间数据分析中非常有用,尤其是在需要将数据限制在特定地理区域…...
crewai框架第三方API使用官方RAG工具(pdf,csv,json)
最近在研究调用官方的工具,但官方文档的说明是在是太少了,后来在一个视频里看到了如何配置,记录一下 以PDF RAG Search工具举例,官方文档对于自定义模型的说明如下: 默认情况下,该工具使用 OpenAI 进行嵌…...
算法 哈夫曼树和哈夫曼编码
目录 前言 一,二进制转码 二,哈夫曼编码和哈夫曼树 三,蓝桥杯 16 哈夫曼树 总结 前言 这个文章需要有一定的树的基础,没学过树的伙伴可以去看我博客树的文章 当我们要编码一个字符串转成二进制的时候,我们要怎么…...
TCP 丢包恢复策略:代价权衡与优化迷局
网络物理层丢包是一种需要偿还的债务,可以容忍低劣的传输质量,这为 UDP 类服务提供了空间,而对于 TCP 类服务,可以用另外两类代价来支付: 主机端采用轻率的 GBN 策略恢复丢包,节省 CPU 资源,但…...
Sumatra PDF:小巧免费,满足多样阅读需求
Sumatra PDF是一款完全免费的本地阅读器软件,以小巧的体积和全面的功能受到用户青睐。如今,它已经更新到3.3版本,带来了更多实用功能,尤其是新增的注释功能,值得我们再次关注。 软件特色 轻量级体积:压缩…...
vue2-给data动态添加属性
vue2-给data动态添加属性 1. 问题的来源 在VUe2中(VUE3中使用了proxy,及时动态添加也能实现响应式),如果我们动态给data添加一个属性,会发现视图没有同步更新举个例子我们通过v-for遍历data中的一个属性list…...
TiDB 分布式数据库多业务资源隔离应用实践
导读 随着 TiDB 在各行业客户中的广泛应用 ,特别是在多个业务融合到一套 TiDB 集群中的场景,各企业对集群内多业务隔离的需求日益增加。与此同时,TiDB 在多业务融合场景下的资源隔离方案日趋完善,详情可参考文章 《你需要什么样的…...
105,【5】buuctf web [BJDCTF2020]Easy MD5
进入靶场 先输入试试回显 输入的值成了password的内容 查看源码,尝试得到信息 什么也没得到 抓包,看看请求与响应里有什么信息 响应里得到信息 hint: select * from admin where passwordmd5($pass,true) 此时需要绕过MD5()函…...
BFS(广度优先搜索)——搜索算法
BFS,也就是广度(宽度)优先搜索,二叉树的层序遍历就是一个BFS的过程。而前、中、后序遍历则是DFS(深度优先搜索)。从字面意思也很好理解,DFS就是一条路走到黑,BFS则是一层一层地展开。…...
33.Word:国家中长期人才发展规划纲要【33】
目录 NO1.2样式 NO3 图表 NO4.5.6 开始→段落标记视图→导航窗格→检查有无遗漏 NO1.2样式 F12/另存为:Word.docx:考生文件夹样式的复制样式的修改 样式的应用(没有相似/超级多的情况下)——替换 [ ]通配符&#x…...
gym-anytrading
参考:https://github.com/upb-lea/gym-electric-motor AnyTrading 是一组基于 reinforcement learning (RL) 的 trading algorithms(交易算法)的 OpenAI Gym 环境集合。 该项目主要用于foreign exchange (FOREX) 和 stock markets (股票市场)…...
如何自定义软件安装路径及Scoop包管理器使用全攻略
如何自定义软件安装路径及Scoop包管理器使用全攻略 一、为什么无法通过WingetUI自定义安装路径? 问题背景: WingetUI是Windows包管理器Winget的图形化工具,但无法直接修改软件的默认安装路径。原因如下: Winget设计限制…...
私有化部署 DeepSeek + Dify,构建你的专属私人 AI 助手
私有化部署 DeepSeek Dify,构建你的专属私人 AI 助手 概述 DeepSeek 是一款开创性的开源大语言模型,凭借其先进的算法架构和反思链能力,为 AI 对话交互带来了革新性的体验。通过私有化部署,你可以充分掌控数据安全和使用安全。…...
Java 进阶 01 —— 5 分钟回顾一下 Java 基础知识
Java 进阶 01 —— 5 分钟回顾一下 Java 基础知识 Java 生态圈Java 跨平台的语言 Java 虚拟机规范JVM 跨语言的平台多语言混合编程两种架构 举例 JVM 的生命周期 虚拟机的启动虚拟机的执行虚拟机的退出 JVM 发展历程 Sun Classic VMExact VMHotSpotBEA 的 JRockitIBM 的 J9 …...
V103开发笔记1-20250113
2025-01-13 一、应用方向分析 应用项目: PCBFLY无人机项目(包括飞控和手持遥控器); 分析移植项目,应用外设资源包括: GPIO, PWM,USART,GPIO模拟I2C/SPI, ADC,DMA,USB等; 二、移植项目的基本…...
在 Spring Boot 项目中,bootstrap.yml 和 application.yml文件区别
在 Spring Boot 项目中,bootstrap.yml 和 application.yml 是两个常用的配置文件,它们的作用和加载顺序有所不同。以下是它们的详细说明: 1. bootstrap.yml 作用: bootstrap.yml 是 Spring Cloud 项目中的配置文件,用于…...
DeepSeek研究员在线爆料:R1训练仅用两到三周,春节期间观察到R1 zero强大进化
内容提要 刚刚我注意到DeepSeek研究员Daya Guo回复了网友有关DeepSeek R1的一些问题,以及接下来的公司的计划,只能说DeepSeek的R1仅仅只是开始,内部研究还在快速推进,DeepSeek 的研究员过年都没歇,一直在爆肝推进研究…...
Java进阶文件输入输出实操(图片拷贝)
Java进阶文件输入输出实操(图片拷贝) 把某个目录下的全部图片,全部拷贝到另外一个目录 package test; import domee.chapter6_7.B; import java.io.*; public class Ex10_10 { public static void main(String[] args) throws IOException { …...
Spring Boot统一异常拦截实践指南
Spring Boot统一异常拦截实践指南 一、为什么需要统一异常处理 在Web应用开发中,异常处理是保证系统健壮性和用户体验的重要环节。传统开发模式中常见的痛点包括: 异常处理逻辑分散在各个Controller中错误响应格式不统一敏感异常信息直接暴露给客户端…...
LLM推理--vLLM解读
主要参考: vLLM核心技术PagedAttention原理 总结一下 vLLM 的要点: Transformer decoder 结构推理时需要一个token一个token生成,且每个token需要跟前序所有内容做注意力计算(包括输入的prompt和该token之前生成的token…...
vscode软件操作界面UI布局@各个功能区域划分及其名称称呼
文章目录 abstract检查用户界面的主要区域官方文档关于UI的介绍 abstract 检查 Visual Studio Code 用户界面 - Training | Microsoft Learn 本质上,Visual Studio Code 是一个代码编辑器,其用户界面和布局与许多其他代码编辑器相似。 界面左侧是用于访…...
PyQt6/PySide6 的 QTreeView 类
QTreeView 是 PyQt6 或 PySide6 库中用于显示分层数据的控件。它适用于展示树形结构的数据,如文件系统、组织结构等。QTreeView 也是基于模型-视图架构的,通常与 QAbstractItemModel 的子类(如 QStandardItemModel 或自定义模型)一…...
一键开启/关闭deepseek
一键开启/关闭 Deepseek对应下载的模型一键开启 Deepseek,一键关闭Deepseek双击对应的bat,就可以启动https://mbd.pub/o/bread/Z56YmpZvbat 下载:https://mbd.pub/o/bread/Z56YmpZv 可以自己写下来,保存成bat文件,也可…...
单纯接入第三方模型就无需算法备案了么?
随着人工智能技术的快速发展,越来越多的企业开始接入第三方模型以提升自身业务能力。然而,关于算法备案的问题也引发了诸多讨论,尤其是单纯接入第三方模型是否需要备案这一问题,更是让不少企业感到困惑。 一、明确算法备案的主体…...
