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万+

第21章 分层架构软件测试

技术人员和客户代表对代码服务相关的技术进行详细的交流,由此确定代码审计的方案(哪些代码要审计、用什么方式审计、审计的时间、审计的要求等)代码审计报告提交和沟通之后,跟开发人员针对代码审查发现的问题进行修改,然后代码审查人员进行回归的检查,然后提交复查的报告;本层不需要了解其它层的实现细节,只需要考虑与本层相关的两层之间的接口和调用的情况。然后对客户要求的功能点进行人工的代码审查,对源代码的扫描结果进行人工的分析和确认;结合自动化扫描的结果和人工审查的结果生成测试对象的代码审查报告,最后提交给客户;

李黏黏的博客 3271

【信息安全】seed-labs实验-Firewall Exploration Lab

本实验主要就是基于LKM和Netfilter实现简单的防火墙,重点是后者。路由器是有两个ip的,一个是外网ip,一个是内网ip每一次做完实验,都要做好收尾工作(比如:模块装入之后,要记得移除;iptables命令设置完规则之后,要把对应规则删掉)

可乐大牛的博客 5995

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

iStore增强插件 如何重塑家庭网络与存储体验

本文深入解析了iStore增强插件如何重塑家庭数字生活体验。它通过集成智能流控、一键式文件共享、媒体服务器及智能家居网关等功能,将复杂的网络配置、存储管理与设备协同简化为图形化操作,有效解决了家庭网络卡顿、数据割裂与使用门槛高等核心痛点,让普通用户也能轻松打造高效、稳定、安全的家庭数字中枢。

prometheus9mon的博客 648

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

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

King_lxh的博客 953

Ubuntu22.04上如何用Docker一键部署Ragflow+Ollama(附CUDA配置避坑指南)

本文详细介绍了在Ubuntu22.04系统上使用Docker一键部署Ragflow+Ollama的完整流程,特别提供了CUDA配置的避坑指南。从硬件兼容性检查、驱动安装到容器网络配置,手把手教你搭建本地化大模型环境,解决CUDA驱动冲突等常见问题,助力开发者快速构建AI应用开发平台。

weixin_26875109的博客 284

Simulink中扩张状态观测器ESO搭建与参数整定实战

扩张状态观测器(ESO)是自抗扰控制(ADRC)的核心,用于估计系统总扰动并实时补偿。其原理是将扰动扩张为状态变量,通过观测器带宽配置增益,实现扰动估计。在Simulink中搭建ESO可直观验证连续与离散域性能,解决参数整定与噪声折中问题。典型应用包括运动控制、电力电子和机器人驱动。本文基于MATLAB/Simulink,详细讲解线性ESO的模型结构、参数计算、离散化实现及常见问题排查,帮助读者从零搭建并调试ESO仿真。

weixin_34116482的博客 221

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

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

Mesar的博客 1318

VC Spyglass调试秘籍:从Lint报错到代码修复的完整工作流

本文详细介绍了VC Spyglass调试的完整工作流,重点解析了如何高效定位和修复Lint检查中常见的XMRE-L跨模块引用错误。通过对比GUI与命令行(vc_static_shell)双模式调试技巧,并结合TCL脚本实现批量处理与规则豁免,帮助数字设计工程师系统化地提升代码调试效率与质量。

weixin_29246195的博客 575

C++【STL】之priority_queue学习

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

cw412524的博客 1084

Oracle EBS FA 如何打开关闭的资产会计期间?

用户“运行折旧”,误勾选为“关闭期间”,还有一部分资产还需要操作报废和调整,希望后台打开关闭的资产会计期。

陈显平的专栏-Oracle EBS 1029

VOS中历史话单显示通话会话超时中断详解

假设一种场景:  主叫拨打被叫,主叫方异常离线,被叫方接听,被叫方发送200ok至VOS,VOS传送200ok给主叫,但是主叫方未给出正常ack回应,VOS重发几次后(根据SIP参数设定的重发机制),然后VOS服务器会中断话务,历史话单终止原因为会话超时。 参考呼叫分析信令如下图: ...

非著名运维的博客 5017

C++ STL 学习| priority_queue

C++ STL 学习| priority_queue

qq_42218240的博客 191

大中型超市收银系统(可直接运行)

光步前台收银系统系统功能:商品销售、商品退货、挂单、收银员权限、会员销售、单品取消、整单取消、商品查询、脱机销售、脱机数据上传,基本资料下载,开钱箱、小票打印、收款结算,支持多币种付款方式(现金、储值卡、礼券、微信等),支持多种促销。运行环境:.net 4.0登陆信息用户名:1001 密码:123456内置商品信息,商品编码可输入00001000 - 00010000,测试效果相关功能键F5 结算 F9挂单 F11商品查询 F8退货 Insert单品取消 Del整单取消 F12开钱箱F2 会员 Ctrl+Z退出系统 Home 锁屏 相关源码待公开

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

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

Kaisir777的博客 992

efm32 入门.pdf

本PDF共计22页,介绍的是操作驱动API,下载与否自己斟酌。

老版QQ原生表情gif动态

这是老版的QQ表情,不过全是动态的的,Windows照片查看器是不会动的,可以右击用浏览器打开查看,再说一遍是老版的,只是分享给宁愿用老版也要动态的人。

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

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

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

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【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、付费专栏及课程。

余额充值