c++ priority_queue用法

1 priority_queue的定义

基本定义方法:

基本定义默认是使用大顶堆的,即队首总是最大的元素

priority_queue<int> q;//储存int型数据 
priority_queue<double> q;//储存double型数据 
priority_queue<string> q;//储存string型数据 
priority_queue<结构体名> q;//储存结构体或者类 
快速切换大小顶堆定义:

less<储存的数据类型> 即使用大顶堆

greater<储存的数据类型> 即是用小顶堆

priority_queue<储存的类型,vector<储存的类型>,顶堆的类型> 容器名

eg:

使用大顶堆的队列
priority_queue<int,vector<int>,less<int>> q;//储存int型数据 
priority_queue<double,vector<double>,less<double>> q;//储存double型数据 
priority_queue<string,vector<string>,less<string>> q;//储存string型数据 
priority_queue<结构体名,vector<结构体名>,less<结构体名>> q;//储存结构体或者类 
使用小顶堆的队列
priority_queue<int,vector<int>,greater<int>> q;//储存int型数据
priority_queue<double,vector<double>,greater<double>> q;//储存double型数据
priority_queue<string,vector<string>,greater<string>> q;//储存string型数据
priority_queue<结构体名,vector<结构体名>,greater<结构体名>> q;//储存结构体或者类 
使用结构体重载运算符定义:
priority_queue<int,vector<int>,cmp> q;//储存int型数据 
priority_queue<double,vector<double>,cmp> q;//储存double型数据 
priority_queue<string,vector<string>,cmp> q;//储存string型数据
priority_queue<结构体名,vector<结构体名>,cmp> q;//储存结构体或者类 

2 priority_queue的成员函数

empty() 如果优先队列为空,则返回真 
pop() 删除第一个元素 
push() 加入一个元素 
size() 返回优先队列中拥有的元素的个数 
top() 返回优先队列中有最高优先级的元素 

3 重载

函数重载
#include <iostream>
#include <queue>
using namespace std;struct Test {int val;Test(int v) : val(v) {}
};// 自定义比较函数
bool compare(const Test& t1, const Test& t2) {return t1.val < t2.val;
}int main() {// 定义一个优先级队列,使用自定义的比较函数priority_queue<Test, vector<Test>, decltype(&compare)> pq(&compare);// 插入一些元素pq.push(Test(3));pq.push(Test(1));pq.push(Test(5));pq.push(Test(2));// 输出队列中的元素while (!pq.empty()) {cout << pq.top().val << " ";pq.pop();}cout << endl;return 0;
}

decltype它的作用是从变量或表达式的类型中推导出类型,并在这里用于获取比较函数的类型以传递给 priority_queue。如果你知道比较函数的类型,也可以直接在模板参数中指定该类型,而不必使用 decltype

class Solution {
public:// 假设这里有其他方法和成员函数ListNode* mergeKLists(vector<ListNode*>& lists) {priority_queue<ListNode*, vector<ListNode*>, bool (*)(ListNode*, ListNode*)> pq(compare); // 直接指定比较函数的类型// 将 lists 中的元素依次压入优先队列for (ListNode* node : lists) {if (node != nullptr) {pq.push(node);}}ListNode* dummy = new ListNode(0);ListNode* current = dummy;// 从优先队列中取出最小元素,并将其后续节点压入队列,直到队列为空while (!pq.empty()) {ListNode* topNode = pq.top();pq.pop();current->next = topNode;current = current->next;if (topNode->next != nullptr) {pq.push(topNode->next);}}return dummy->next;}
};

bool (*)(ListNode*, ListNode*) 是一个函数指针类型,它表示指向一个接受两个 ListNode* 类型参数并返回 bool 类型值的函数的指针。在这个上下文中,它用来指定优先级队列中元素比较的函数类型。

具体解释如下:

  • bool 表示函数的返回类型为布尔值,用于表示比较结果的真假。
  • (*ptr) 表示这是一个指针。
  • (ListNode*, ListNode*) 表示函数接受两个 ListNode* 类型的参数。

因此,bool (*)(ListNode*, ListNode*) 表示指向一个接受两个 ListNode* 参数并返回布尔值的函数的指针类型。

结构体重载
#include<iostream>//c++标准头文件,可以使用cout,cin等标准库函数 
#include<queue>//使用priority_queue时需要的头文件 
using namespace std;//命名空间,防止重名给程序带来各种隐患,使用cin,cout,stack,map,set,vector,queue时都要使用
struct test{//定义一个结构体test int val;test(int v){//构造函数 this->val=v;}
//	下面是基本的运算方法,我们不能随意更改它 bool operator > (const test t)const{//重载运算符return val>t.val;}bool operator < (const test t)const{//重载运算符return val<t.val;}
};struct cmp{bool operator () (const test t1,const test t2)const{//重载括号运算符return t1.val<t2.val;//小于号是大根堆,大于号是小根堆 }
};
int main(){priority_queue<test,vector<test>,cmp> q;//自定义一个优先级队列q cout<<"自定义一个优先级队列q: priority_queue<test,vector<test>,cmp> q"<<endl; q.push(test(10));//向队列中添加一个test,val的值为10 q.push(test(5));//向队列中添加一个test,val的值为5q.push(test(7));//向队列中添加一个test,val的值为7cout<<"q.top().val="<<q.top().val<<endl;cout<<endl; q.pop();cout<<"q.top().val="<<q.top().val<<endl;cout<<endl; q.pop();cout<<"q.top().val="<<q.top().val<<endl;cout<<endl; q.pop();cout<<"目前队列是空的,不能使用q.top()查询队首元素"<<endl;}

转载自:c++ priority_queue用法 入门必看 超详细

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/7919.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

英语学习笔记1——Excuse me!

Excuse me! 对不起&#xff01; 词汇 Vocabulary excuse v. 原谅 [iks’kju:z] 用法&#xff1a;1. Excuse me! 对不起&#xff01; 用于以下场景&#xff1a; 向陌生人问路 牢记引起别人注意中途离开某个场所。发出怪声&#xff08;如打喷嚏之后&#xff09; 和 I’m sorr…

详解AI作画算法原理

AI作画算法的原理通常涉及深度学习和计算机视觉技术。下面是一个简要的解释&#xff1a; 数据准备&#xff1a;首先&#xff0c;需要准备大量的绘画数据&#xff0c;包括各种风格和类型的绘画作品。这些数据通常由艺术家的作品组成&#xff0c;可以包括油画、水彩画、素描等。 …

【C++】 constexpr 关键字的使用和示例

constexpr是C中一个重要的关键字&#xff0c;它用于声明可以在编译时期计算的变量和函数。这意味着使用constexpr声明的实体可以在编译时求值&#xff0c;从而可以作为模板参数或数组大小等需要编译时确定的上下文中使用 1. 定义变量 constexpr变量必须在定义时初始化&#x…

【代码随想录算法训练营第37期 第一天 | LeetCode704. 二分查找、27. 移除元素】

代码随想录算法训练营第37期 第一天 | LeetCode704. 二分查找、27. 移除元素 一、704. 二分查找 解题代码C&#xff1a; class Solution { public:int search(vector<int>& nums, int target) {int len nums.size();int l 0, r len - 1;while(l < r){int mid…

大数据与会计专业主要学什么课程

大数据与会计专业是一个结合了传统会计知识与现代大数据技术的交叉学科&#xff0c;旨在培养既懂会计又熟悉大数据分析的复合型人才。该专业的学生将会学习以下主要课程内容&#xff1a; 会计基础课程&#xff1a;包括基础会计、财务会计、成本会计、管理会计等&#xff0c;这些…

有了这么多套件,为什么还需要APaaS

文/明道云创始人任向晖 在明道云的业务活动中&#xff0c;比较常见的一个问题是和套件应用的关系。一个有具体应用需求的客户为什么不从市场上购买现成的套件应用&#xff0c;而要选择APaaS来构建呢&#xff1f;反过来说似乎也成立&#xff0c;既然一个平台什么应用都能搭建&a…

使用双指针解决问题题集(二)

1. 有效三角形的个数 给定一个包含非负整数的数组 nums &#xff0c;返回其中可以组成三角形三条边的三元组个数。 示例 1: 输入: nums [2,2,3,4] 输出: 3 解释:有效的组合是: 2,3,4 (使用第一个 2) 2,3,4 (使用第二个 2) 2,2,3 示例 2: 输入: nums [4,2,3,4] 输出: 4 题解&a…

软件系统测试方案书(测试计划-Word原件)

2 引言 2.1 编写目的 2.3 测试人员 2.4 项目背景 2.5 测试目标 2.6 简写和缩略词 2.7 参考资料 2.8 测试提交文档 2.9 测试进度 3 测试环境 3.1 软硬件环境 4 测试工具 5 测试策略 5.1 测试阶段划分及内容 5.1.1 集成测试 5.1.2 系统测试 5.1.2.1 功能测试 5.…

深入解析智能指针:从实践到原理

&#x1f466;个人主页&#xff1a;晚风相伴 &#x1f440;如果觉得内容对你有所帮助的话&#xff0c;还请一键三连&#xff08;点赞、关注、收藏&#xff09;哦 如果内容有错或者不足的话&#xff0c;还望你能指出。 目录 智能指针的引入 内存泄漏 RAII 智能指针的使用及原…

STM32F10x移植FreeRTOS

一、获取FreeRTOS源码 &#xff08;1&#xff09;登录FreeRTOS官网&#xff1a;www.freertos.org&#xff0c;下载第一个压缩包 &#xff08;2&#xff09;通过GitHub网站&#xff1a;github.com/FreeRTOS/FreeRTOS下载&#xff0c;由于该网站服务器在国外&#xff0c;所以访问…

1688快速获取整店铺列表 采集接口php Python

在电子商务的浪潮中&#xff0c;1688平台作为中国领先的批发交易平台&#xff0c;为广大商家提供了一个展示和销售商品的广阔舞台&#xff1b;然而&#xff0c;要在众多店铺中脱颖而出&#xff0c;快速获取商品列表并进行有效营销是关键。 竞争对手分析 价格比较&#xff1a;…

【强训笔记】day12

NO.1 思路&#xff1a;哈希表&#xff0c;建立bool数组&#xff0c;将要删除的字符串存入哈希表&#xff0c;并标为true&#xff0c;再遍历要做处理的字符串&#xff0c;如果在哈希表中为false&#xff0c;就输出。 代码实现&#xff1a; #include <iostream> #includ…

喜报 | 擎创科技荣获NIISA联盟2023年度创新技术特等奖!

为深入实施创新驱动发展战略&#xff0c;紧紧把握全球科技革命和产业变革方向&#xff0c;密切跟踪前沿科技新趋势&#xff0c;经科技部中国民营促进会业务主管部门批准以及国家互联网数据中心产业技术创新战略联盟&#xff08;以下简称联盟&#xff09;总体工作安排&#xff0…

代码随想录算法训练营第十八天:二叉树的层序遍历(中间放假)

代码随想录算法训练营第十八天&#xff1a;二叉树的层序遍历&#xff08;中间放假&#xff09; ‍ ​​ 102.二叉树的层序遍历 力扣题目链接(opens new window) 给你一个二叉树&#xff0c;请你返回其按 层序遍历 得到的节点值。 &#xff08;即逐层地&#xff0c;从左到右…

Java 框架安全:Struts2 漏洞序列测试.

什么是 Struts2 框架 Struts 2 是一个用于创建企业级 Java 应用程序的开源框架。它是一个 MVC&#xff08;模型-视图-控制器&#xff09;框架&#xff0c;用于开发基于 Java EE&#xff08;Java Platform, Enterprise Edition&#xff09;的 Web 应用程序。Struts 2 主要解决…

【Linux】HTTPS

欢迎来到Cefler的博客&#x1f601; &#x1f54c;博客主页&#xff1a;折纸花满衣 &#x1f3e0;个人专栏&#xff1a;Linux 目录 &#x1f449;&#x1f3fb;HTTPS协议概念&#x1f449;&#x1f3fb;加密为什么要进行加密 &#x1f449;&#x1f3fb;常见的加密方式对称加密…

【MATLAB源码-第204期】基于matlab的语音降噪算法对比仿真,谱减法、维纳滤波法、自适应滤波法;参数可调。

操作环境&#xff1a; MATLAB 2022a 1、算法描述 语音降噪技术的目的是改善语音信号的质量&#xff0c;通过减少或消除背景噪声&#xff0c;使得语音更清晰&#xff0c;便于听者理解或进一步的语音处理任务&#xff0c;如语音识别和语音通讯。在许多实际应用中&#xff0c;如…

基于FPGA的DDS波形发生器VHDL代码Quartus仿真

名称&#xff1a;基于FPGA的DDS波形发生器VHDL代码Quartus仿真&#xff08;文末获取&#xff09; 软件&#xff1a;Quartus 语言&#xff1a;VHDL 代码功能&#xff1a; DDS波形发生器VHDL 1、可以输出正弦波、方波、三角波 2、可以控制输出波形的频率 DDS波形发生器原理…

el-form 根据数组动态渲染的el-form-item必填校验绑定

需求&#xff1a;可手动动态添加的输入框&#xff0c;有必填校验 代码&#xff1a;这里模拟电话必填&#xff0c; 注意&#xff1a;1&#xff0c;el-from必须绑定数据&#xff1a;下例&#xff08;&#xff1a;modelform; 2,el-form-item必须绑定prop:下例&#xff08;:prop&…

mysql学习手记

1.视图 简单一句&#xff1a;将需要重复使用的mysql语句放到视图中去 视图优点&#xff1a;1.简化查询 2.减少数据库改动的成本 3.限制访问 -- 创建视图 CREATE VIEW view_name AS SELECT column1, column2, ... FROM table_name WHERE condition;-- 使用视图 SELECT * FROM…