C++STL priority_queue 学习

STL大根堆小根堆 题目 #include<bits/stdc++.h> using namespace std; #define mp make_pair typedef pair<int,int>pill; priority_queue <pill,vector<pill>,less<pill> > Q; const int N=2e6+10; int n,k,a[N]; int main() { cin>>n>>k; for(int 阅读详情

C++STL priority_queue 学习

本文来源自网上摘抄,故学习记录于此。

 

包含priority_queue 的头文件是 <queue>

 

priority_queue类的主要成员:

priority_queue();    //默认构造函数,生成一个空的排序队列

priority_queue(const queue&);    //拷贝构造函数

priority_queue& operator=(const priority_queue &);    //赋值运算符重载

priority_queue 的私有成员:

value_type;   //priority_queue中存放的对象类型,它和priority_queue中的T类型相同

priority_queue(const Compare& comp);    //构造生成一个空的priority_queue对象,使用comp作为priority_queue的comparison

priority_queue(const value_type* first, const value_type* last);    //带有两个参数的构造 函数,使用默认的Comparison作为第三个参数

size_type;    //正整数类型,和Sequence::size_type类型一样。

bool empty() const;    //判断优先级队列是否为空,为空返回true,否则返回false

size_type size() const;    //返回优先级队列中的元素个数

const value_type& top() const();    //返回优先级队列中第一个元素的参考值。

void push(const value_type& x);    //把元素x插入到优先级队列的尾部,队列的长度加1

void pop();    //删除优先级队列的第一个值,前提是队列非空,删除后队列长度减1

 

priority_queue<Type, Container, Functional>

 如果我们把后面俩个参数缺省的话,优先队列就是大顶堆,队头元素最大。(这点由上面的程序可以看出)

Parameter

Description

Default

T

The type of object stored in the priority queue.

 

Sequence

The type of the underlying container used to implement the priority queue.

vector<T>

Compare

The comparison function used to determine whether one element is smaller than

another element. If Comparex,y) is true, then x is smaller than y. The element

returned by Q.top) is the largest element in the priority queue. That is, it has the

 property that, for every other element x in the priority queue, Compare(Q.top(), x) is false.

less<T>

 

自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。

但此时不能像基本类型这样声明

priority_queue<Node, vector<Node>, greater<Node> >;

原因是 greater<Node> 没有定义,如果想用这种方法定义

则可以按如下方式:

 

     
#include < iostream >
#include < queue >
using namespace std;
struct Node
{
int x,y;
Node( int a = 0 , int b = 0 ):x(a),y(b){}
};
struct cmp
{
bool operator ()(Node a,Node b){
if (a.x == b.x)
return a.y > b.y;
return a.x > b.x;
}
};
int main(){
priority_queue < Node,vector < Node > ,cmp > q;
for ( int i = 0 ; i < 10 ; ++ i)
{
q.push(Node(rand(),rand()));
}
while ( ! q.empty())
{
cout << q.top().x << " " << q.top().y << endl;
q.pop();
}
return EXIT_SUCCESS;
}

其实就三种用法

第一种,直接使用默认的。

它的模板声明带有三个参数,priority_queue<Type, Container, Functional>
Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个
参数缺省的话,优先队列就是大顶堆,队头元素最大。
看例子


priority_queue<int> qi;

    int a[len] = {3,5,9,6,2};

    priority_queue<int> qi;
    for(i = 0; i < len; i++)
        qi.push(a[i]);

    for(i = 0; i < len; i++)
    {
        cout<<qi.top()<<" ";
        qi.pop();
    }

通过<操作符可知在整数中元素大的优先级高。
故例子中输出结果为:9 6 5 3 2

第二种:

第二种方法:
在示例1中,如果我们要把元素从小到大输出怎么办呢?
这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。

如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
priority_queue<int, vector<int>, greater<int> >qi2;

对于自定义类型,则必须自己重载 operator< 或者自己写仿函数

#include <iostream>
#include <queue>

using namespace std;

struct Node{
    int x, y;
    Node( int a= 0, int b= 0 ):
        x(a), y(b) {}
};

bool operator<( Node a, Node b ){
    if( a.x== b.x ) return a.y> b.y;
    return a.x> b.x; 
}

int main(){
    priority_queue<Node> q;
    
    for( int i= 0; i< 10; ++i )
    q.push( Node( rand(), rand() ) );
    
    while( !q.empty() ){
        cout << q.top().x << ' ' << q.top().y << endl;
        q.pop();
    }
    
    getchar();
    return 0;
}

 

或者这样定义也是能达到效果的:

struct Node{
    int x, y;
    Node( int a= 0, int b= 0 ):
        x(a), y(b) {}

    friend operator<( Node a, Node b ){
    if( a.x== b.x ) return a.y> b.y;
    return a.x> b.x;

    }
};

自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。
但此时不能像基本类型这样声明
priority_queue<Node, vector<Node>, greater<Node> >;
原因是 greater<Node> 没有定义,如果想用这种方法定义
则可以按如下方式

例子:

#include <iostream>
#include <queue>

using namespace std;

struct Node{
    int x, y;
    Node( int a= 0, int b= 0 ):
        x(a), y(b) {}
};

struct cmp{
    bool operator() ( Node a, Node b ){
        if( a.x== b.x ) return a.y> b.y;
        
        return a.x> b.x; }
};

int main(){
    priority_queue<Node, vector<Node>, cmp> q;
    
    for( int i= 0; i< 10; ++i )
    q.push( Node( rand(), rand() ) );
    
    while( !q.empty() ){
        cout << q.top().x << ' ' << q.top().y << endl;
        q.pop();
    }
    
    getchar();
    return 0;
}

还有一点要注意的是priority_queue中的三个参数,后两个可以省去,因为有默认参数,不过如果,有第三个参数的话,必定要写第二个参数。



【C++】大根堆(优先队列 priority_queue)与 小根堆 而在这个例子中,我们使用了STL自带的小根堆,因此需要将。是指底层容器的类型,而。是指比较函数对象的类型。 阅读详情

相关推荐

C++STL之priority_queue的简单使用_在c++stl中priority_queue用法

priority_queue(优先级队列)模拟的也是队列这种存储结构,它底层采用堆结构存储数据,即使用此容器存储元素只能“从一端进(称为队尾),从另一端出(称为队头)”,且每次只能访问 priority_queue 中位于队头的元素。但是,priority_queue 中元素的存和取,遵循的并不是 “First in,First out”(先入先出)原则,而是“First in,Optimal out”原则。指的就是先进队列的元素并不一定先出队列,而是优先级最大的元素最先出队列。

2301_82244279的博客 1187

数据结构—堆 大根堆 小根堆 STL实现

我是真的不会 优先队列创建小根堆的遍历,所以我就通过调试的方法,给大家展示了。

up_up_up_的博客 1634

C++ STL容器与常用库函数

C++ STL(STL是提高C++编写效率的一个利器)

嵌入式技术开发 7394

C++ STL 中大根堆,小根堆的应用。

1》优先队列:在C++中优先队列默认的是大根堆,如果用小根堆则加入greater. priority_queue<int, vector<int>, less<int>>s;//less表示按照递减(从大到小)的顺序插入元素 priority_queue<int, vector<int>, greater<int>>s;//greater表示按照递增(从小到大)的顺序插入元素 不写第三个参数或者写成less都是大根堆。greater是

兰斯兰斯 2万+

保姆级教程:SAP ABAPer如何为VF01销售发票和MIRO发票校验配置凭证替代(含AC_DOCUMENT BADI完整代码示例)

本文详细解析了SAP ABAP中通过AC_DOCUMENT BADI实现VF01销售发票和MIRO发票校验的凭证替代技术。从技术选型到BADI实施步骤,再到核心逻辑代码示例,为ABAP开发者提供了一套完整的解决方案,帮助应对财务部门复杂的业务需求。

weixin_30421809的博客 350

BEVFormer vs BEVFusion:5个关键差异点帮你选对环视感知方案

本文深入对比了自动驾驶领域两大主流环视感知方案BEVFormer与BEVFusion。BEVFormer作为纯视觉BEV感知的标杆,通过注意力机制隐式学习深度,成本较低;而BEVFusion作为多模态融合典范,融合激光雷达与摄像头数据,在性能、小目标检测及极端环境鲁棒性上优势显著。文章从计算效率、部署成本、数据依赖性等五个核心维度提供选型指南,帮助技术决策者根据自身算力预算与传感器配置做出明智选择。

weixin_29306011的博客 124

C++学习之STL学习:stack\queue\priority_queue

官方文档:stack - C++ 参考stack的介绍queue - C++ 参考queue(单端队列)的介绍​​​​​​deque - C++ 参考deque(双端队列)的介绍deque的结构图官方文档:priority_queue - C++ 参考入数据随便入,出数据按优先级高的出队列。而数据大的优先级高,优先出队列int main()//数据大的优先级高;//优先级高的优先出队列pq.push(5);pq.push(3);pq.push(8);pq.push(1);

2401_89119815的博客 843

基于分段线性近似的Softmax硬件加速器设计

本文深入探讨了基于分段线性近似的Softmax硬件加速器设计。针对深度学习模型中Softmax函数在硬件实现时指数运算成本高昂的问题,提出用分段线性拟合替代传统泰勒展开,通过一次乘加操作高效完成计算,并详细分析了输入范围压缩、精度与硬件资源权衡、以及包含地址生成、参数查找、乘加计算和归一化的完整硬件架构。该方法在保证精度的同时,显著提升了AI边缘芯片的推理速度和能效。

weixin_28278377的博客 312

【C++ STL】 容器详解:priority_queue 学习

/T:存储的元素类型。//Container:底层容器类型,默认为vector<T>。//Compare:比较函数对象类型,默认为less<T>,即最大堆。定义一个存储整数的最大堆:定义一个存储整数的最小堆:// 插入元素// 访问队头(最大值)cout << "队头: " << pq.top() << endl;return 0;队头: 30可以看到,最大元素优先出队。默认情况下,是大顶堆,如果需要小顶堆(最小值优先),可以使用greater<>如果需要。

King_lxh的博客 953

某讯天御滑块验证码逆向实战:从参数解析到环境对抗

本文详细解析了某讯天御滑块验证码的逆向工程实战技巧,从关键参数解析到浏览器环境模拟对抗。重点介绍了collect、eks等参数的逆向思路,以及如何通过puppeteer等工具补全环境检测,帮助开发者有效突破验证码防护。文章还提供了常见错误解决方案和性能优化建议,是验证码逆向领域的实用指南。

weixin_29325007的博客 437

Label Studio 图像分割自动标注接入教程:从模型预测到一键上传 Predictions

这篇文章详细介绍了如何使用Label Studio进行图像分割任务的自动标注流程。主要内容包括: 环境准备:安装Label Studio和模型推理依赖 项目配置:启动Label Studio服务,创建项目并配置BrushLabels标注界面 数据准备:导入待标注图片,获取API访问凭证 模型推理:运行训练好的分割模型生成预测mask 结果上传:将预测结果转换为Label Studio格式并通过API上传为Predictions 文章提供了完整的操作指南,包括: 详细的命令行参数说明 推荐的项目目录结构 标注

. 451

【C++】STL学习——priority_queue(了解仿函数)

学习优先级队列(堆),认识STL六大组件之一——仿函数

Mesar的博客 1318

[原创]Linux 802.11n CSI tool安装教程(亲测可用)

Linux 802.11n CSI tool安装教程 前言 网上关于Intel5300 CSI tool的教程繁多,实际有效的可以说极少,各种疏漏错误。装的时候被坑无数次,终于调通。其实装这个工具并不太难,但是很多人把它弄得极其复杂,所以写这篇博客来帮助和我有一样困扰的人。我基本沿用的是官方文档旧版本的安装方案,针对其冗杂之处做了大量改进。 旧版安装教程: http://dhalperi....

u014645508的博客 4万+

C++【STL】之priority_queue学习

C++ STL 优先级队列,常用接口的使用和模拟实现详细讲解,干货满满!

cw412524的博客 1084

3.嵌入式控制器EC学习,源码框架(60/64端口)(一)

服务函数剖析 上一篇讲到while循环会一直查询十六个标志位是否满足要求,一旦其中某个标志位为1时,程序将会执行相应的服务函数,而执行服务函数是通过函数指针(service_table[ _R1 ])();来实现的。接下来我们分别来看看这十六个服务函数分别包含了哪些内容。 16个函数的函数名如下: const FUNCT_PTR_V_V code service_table[16] = { // Hi-Level Service Service_PCI, // Host 6

qq_30135687的博客 4160

安卓新奇玩机工具全攻略___联发科MTK v6 限时免费 刷写固件工具操作

摘要:该文介绍一款限时免费的联发科V6刷机工具,支持小米、Vivo、Moto等多品牌设备,包括红米Note14Pro等机型(Klimt/Goya等代码)。工具需注册使用,提供EFS分区备份功能。作者提示工具可能触发杀毒警报,强调禁止非法用途,并说明部分联网工具可能失效。

小马哥的专栏 1316

C++ STL 学习| priority_queue

C++ STL 学习| priority_queue

qq_42218240的博客 191

NTscan扫描工具

ntscan是一个扫描器,可以扫描没有密码和弱密码的共享,先到配置文件中填写猜测的用户名和密码,扫描过程中右侧出现的是扫描日志。

【C++闯关笔记】STL:deque与priority_queue的学习和使用

本文介绍了C++ STL中的deque和priority_queue两种容器适配器。首先讲解了deque的双端队列特性及其作为stack和queue底层容器的优势,但也指出了其遍历效率低的致命缺陷。接着重点讲解了priority_queue的实现原理和使用方法,包括其基于堆的数据结构特性。文章还详细给出了priority_queue的模拟实现代码,重点分析了其中的向上调整(AdjustUP)和向下调整(AdjustDown)算法,这些算法是维护堆结构的关键。最后通过仿函数的使用,展示了如何实现priorit

Kaisir777的博客 992

STM32F407中文手册

STM32f407中文手册 本参考手册面向应用开发人员,提供有关使用 STM32F405xx/07xx、STM32F415xx/17xx、 STM32F42xxx 和 STM32F43xxx 微控制器存储器与外设的完整信息。STM32F405xx/07xx、STM32F415xx/17xx、STM32F42xxx 和 STM32F43xxx 构成一个微 控制器系列,各产品具有不同的存储器大小、封装和外设。有关订购信息以及器件的机械与电气特性,请参见数据手册。有关 ARM Cortex™-M4F 内核的信息,请参见《Cortex™-M4F 技术参考手册》。

数学建模模型总结

这是本人在两年内准备参加数学建模竞赛搜集到的模型资料,已经经过了本人的筛选和整理,希望能够对准备参加数学建模竞赛的学弟学妹们提供一些帮助!

【C++强基篇】学习C++就看这篇--->STL之priority_queue使用及实现

本篇博客详细介绍了priority_queue的使用及实现,对于重要接口进行了剖根问底的解释,以及仿函数相关知识的解析,看完你定有收获

熬夜秃顶中...... 1639

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

【C++STL库】priority queue常用函数学习

priority_queue(优先队列),底层用堆实现的。队首元素是当前队列中优先级最高的一个,优先级是自己规定的。 使用: #include <queue> using namespace std; 1 priority_queue的定义 priority_queue<typename> name; 2 priority_queue容器内元素的访问 //top() 访问队首元素 q.top(); 3 priority_queue常用函数实例解析 //1. push(x) x

小明2766的博客 620

C++STL容器学习总结之五:优先队列priority_queue

&gt;&gt;&gt;C++STL容器学习总结之一:向量vector&lt;&lt;&lt; &gt;&gt;&gt; C++STL容器学习总结之二:链表list&lt;&lt;&lt; &gt;&gt;&gt;C++STL容器学习总结之三:双端队列deque&lt;&lt;&lt; &gt;&gt;&gt;C++STL容器学习总结之

Zebra的博客 321

学习笔记 c++ STL标准库#优先队列priority_queue和#队列queue

学习笔记 c++ STL标准库#优先队列priority_queue和#队列queue一、队列 queue二、优先队列 priority_queue1)自定义Functional比较方式 队列基本思想:先进先出,数组实现方式和此相同,因为栈和队列是一种逻辑结构,数组只是栈和队列的一种实现方式,栈和队列也可以用链表来实现。 一、队列 queue 1.头文件#include"queue" 2.成员函数: push() //放进数据进入队列,第二次放在第一次之后,以此类推 pop()//删掉队列第一个数

m0_47153179的博客 302

C++初阶学习————STL(priority_queue使用及模拟实现)

C++初阶学习

hxMGE的博客 290

STL基础学习——map——queue——priority_queue

【代码】STL基础学习——map———queue———priority_queue。

2401_83080774的博客 399

C++-STL Priority_queue(优先队列)学习

包含的头文件 #include &lt;queue&gt; 优先队列和队列差不多,都是在队尾插入(push)元素,从队头删除(pop)元素.但和队列有所不同的是,priorityQueue的top()先会查找队列中最大的数(队列默认最大数),pop()删除的top()找出来的数,即最大数(假设int类型),看起来就像队列先排了序一样。 priority_queue模板原型 template&lt...

TimeDeath的博客 226

【C++STL学习之路】---stack、queue、priority_queue、deque、Adapter。

目录栈队列双端队列优先级队列设计模式:适配器模式 栈 队列 双端队列 优先级队列 设计模式:适配器模式

Zhou000815的博客 357
上一篇: 智能指针
下一篇: gcc与g++到具体区别
老哂
博客等级 码龄20年 27粉丝 27原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值