优先队列

priority_queue:优先队列,本质是堆实现。与队列不同的是,priority_queue只能访问队列头部的信息(使用top),且插入元素后,会自动排序。

基本操作:

  • top(): 访问队头元素
  • empty(): 队列是否为空
  • size():返回队列内元素个数
  • push():插入元素到队尾 (并排序)
  • emplace():原地构造一个元素并插入队列
  • pop():弹出队头元素
  • swap():交换内容

priority_queue<Type, Container, Functional>

  • Type :数据类型,就是优先队列中每一个元素的数据类型

  • Container :容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector)【简单理解就是用什么容器实现这个优先级队列】

  • Functional :比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆【有greater、less和自定义函数,其中greater使得优先队列中的元素升序排列,所以第一个元素(头部)就是最小的元素,也就是小顶堆;less使得元素降序排列,那么第一个元素就是最大的,也就是大顶堆。】

Demo — greater(),小顶堆

#include<iostream>
#include<queue>    // 使用priority_queue只需要引入 queue 即可
using namespace std;
int main()
{//                      注意这里需要留一个空格 不然编译器会报错,误以为是>> 应该写成> >priority_queue<int,vector<int>,greater<int> > a;a.push(2);a.push(1);// 此时优先队列内部是: 1--2int temp=a.top();// 应该排序规则我们选的是 greater 意思是 升序排列 , 又因为只可以访问队列头部元素// 所以每次访问其实就是访问的最小的那个值 是小顶堆【堆顶最小】cout<<"temp="<<temp<<endl;return 0;
}

运行结果

Demo — less(),大顶堆,【第三参数不填,默认是less】

#include<iostream>
#include<queue>
using namespace std;
int main()
{//                      注意这里需要留一个空格 不然编译器会报错,误以为是>> 应该写成> >priority_queue<int,vector<int>,less<int> > a;a.push(2);a.push(1);a.push(4);// 此时优先队列内部是: 4--2--1 // 因为在push操作的时候,自动会按照排序规则进行排序int temp=a.top();cout<<"temp="<<temp<<endl;return 0;
}

运行结果

什么情况可以使用priority_queue呢?
答:emmmm,可以想象一个场景:给你一个50人的数学成绩,你的任务就是找出前三名的成绩。 【看到这肯定觉得太简单了,先排序,再找前三就OK了,确实可以这样做,不过我们可以使用优先队列(情况复杂时,就可以体现出优先队列的好处了)】
例子:有十个同学对成绩是0、1、2。。。9分,请返回前三名的成绩。

#include<iostream>
#include<queue>
using namespace std;
int main()
{//初始化数组math为 0 1 2 3 。。。9vector<int> math;for(int i=0;i<10;++i)math.push_back(i);//假设我们需要返回前三名 按照第一 第二 第三的顺序// 思路://      首先可以确定的是我们优先队列中只可以包含三个元素,即前三名的成绩//      那么是选用greater 还是less呢//      假设使用less, 那么头部元素就是最大的,而每次对优先队列访问的时候,只可以访问头部//      那么每次其实都是与队列中最大的值进行比较 而没有对剩余对两个数比较 难以达到要求//      假设使用greater 那么头部元素最小(三个中最小),每次进行比较时,都是与最小的进行比较//      如果该元素大于此时的最小值,那么说明此时的头部元素一定不是最终的前三名,【因为本来队列中就有两个比它大,然后又一个元素比他大,那么他肯定不是前三】//      所以直接pop出此时的头部元素,将该元素【比较时大的这个数】压入优先队列,至于与其他两个数的大小,我们不需要关系,因为反正我们可以确定它在前三//      如果此时队列的size() 【也是队列中元素的数量】小于3,那么直接将元素压入即可//      综上:我们选择使用 greaterpriority_queue<int,vector<int>,greater<int> > a;//定义一个优先队列a, 注意此时的写法for(int i=0;i<math.size();++i){if(a.size()==3){if(math[i]>a.top()){a.pop();a.push(math[i]);// 压入的时候,会自动排序}}else{a.push(math[i]);}}// 使用vector<int> ans接收答案vector<int> ans;while(!a.empty()){ans.push_back(a.top());a.pop();}// 因为队列此时是升序排列的:7--8--9 而我们需要的是9--8--7// 那么只需要对ans反序即可reverse(ans.begin(),ans.end());// 验证结果for(int i=0;i<ans.size();++i){cout<<ans[i]<<endl;}return 0;
}

运行结果

自定义排序方式、使用emplace()

  • 样题

swap():交换容器中的内容

测试Demo

#include<iostream>
#include<queue>
using namespace std;
int main()
{priority_queue<int,vector<int>,greater<int> > a;priority_queue<int,vector<int>,greater<int> > b;a.push(1);a.push(2);a.push(3);b.push(4);b.push(5);a.swap(b);// 使用b.swap(a)效果一样cout<<"a:"<<endl;while (!a.empty()){cout<<a.top()<<endl;a.pop();}cout<<endl;cout<<"b:"<<endl;while(!b.empty()){cout<<b.top()<<endl;b.pop();}return 0;
}

运行结果

C++学习笔记(七)~ 优先队列(priority_queue)的简单使用相关推荐

  1. 逆向脱壳破解分析基础学习笔记七 堆栈图(重点)

    本文为本人 大神论坛 逆向破解脱壳学习笔记之一,为本人对以往所学的回顾和总结,可能会有谬误之处,欢迎大家指出. 陆续将不断有笔记放出,希望能对想要入门的萌新有所帮助,一起进步 堆栈图 首先给定一段反汇 ...

  2. Typescript 学习笔记七:泛型

    中文网:https://www.tslang.cn/ 官网:http://www.typescriptlang.org/ 目录: Typescript 学习笔记一:介绍.安装.编译 Typescrip ...

  3. 吴恩达《机器学习》学习笔记七——逻辑回归(二分类)代码

    吴恩达<机器学习>学习笔记七--逻辑回归(二分类)代码 一.无正则项的逻辑回归 1.问题描述 2.导入模块 3.准备数据 4.假设函数 5.代价函数 6.梯度下降 7.拟合参数 8.用训练 ...

  4. websocket 获取连接id_Swoole学习笔记七:搭建WebSocket长连接 之 使用 USER_ID 作为身份凭证...

    Swoole学习笔记七:搭建WebSocket长连接 之 使用 USER_ID 作为身份凭证 2年前 阅读 3678 评论 0 喜欢 0 ### 0.前言 前面基本的WebSocket操作,我们基本都 ...

  5. ROS学习笔记七:使用rqt_console和roslaunch

    ROS学习笔记七:使用rqt_console和roslaunch 本节主要介绍在调试时使用的rqt_console和rqt_logger_level,以及一次性打开多个节点的工具roslaunch. ...

  6. JavaScript学习笔记(三)——从简单模仿到创作

    JavaScript学习笔记(三)--从简单模仿到创作 目前我先列好提纲,利用每晚和周末的闲暇时间,将逐步写完 ^_^ 转载于:https://www.cnblogs.com/mixer/archiv ...

  7. 【K210】K210学习笔记七——使用K210拍摄照片并在MaixHub上进行训练

    [K210]K210学习笔记七--使用K210拍摄照片并在MaixHub上进行训练 前言 K210准备工作 K210如何拍摄照片 准备工作 拍摄相关代码定义 用K210拍摄到的照片在MaixHub平台 ...

  8. Learning ROS for Robotics Programming Second Edition学习笔记(七) indigo PCL xtion pro live

    中文译著已经出版,详情请参考:http://blog.csdn.net/ZhangRelay/article/category/6506865 Learning ROS forRobotics Pro ...

  9. window的dos命令学习笔记 七

    文章目录 一.dos历史学习笔记(后期整合到这里,我想能学到这里的应该不多了,嘿嘿,加油) 二.执行状态返回值(`%errorlevel%`,和shell中`$?`相似): 三.视窗 1.color ...

  10. ESP32学习笔记(七) 复位和时钟

    ESP32学习笔记(七) 复位和时钟 目录: ESP32学习笔记(一) 芯片型号介绍 ESP32学习笔记(二) 开发环境搭建 VSCode+platformio ESP32学习笔记(三) 硬件资源介绍 ...

最新文章

  1. Vertebrae 发布了新的SDK!
  2. java的语法树,JAVA语言语法树.doc
  3. 判断一个变量类型是数组还是对象
  4. 【Todo】Zookeeper系列文章
  5. java - 匿名类
  6. windows路由表 重启后就还原了_绕过Apple id并可以随意重启的终极方案来了 (Windows下操作)...
  7. php 向服务器发放请求,PHP客户端向服务器端发送请求并向远程服务器发送服务器端请求...
  8. linux内核工程导论,Linux内核工程导论——内存管理(3)
  9. python语言能做什么-python语言用来干什么
  10. iOS swift当app从后台切换到前台,或者锁屏后开启唤醒,app收到通知,didBecomeActiveNotification
  11. Tomcat下载及配置(IDEA)
  12. matlab 使用,MATLAB使用方法
  13. 智能网联汽车测试场景数据车载采集平台搭建要求及方法
  14. html静态网站基于游戏网站设计与实现共计10个页面 (仿地下城与勇士游戏网页)
  15. 值得收藏-50个免费可商用图库
  16. redis通配符批量删除keys——del
  17. postgresql模糊查询不区分大小写
  18. 如何用LaTeX写一个PPT
  19. 电脑上最好的5个epub阅读器
  20. TDM-GCC MINGW配置与优化算法测试函数使用

热门文章

  1. RFID医疗耗材管理解决方案-RFID耗材柜管理系统
  2. 移动梦网SP业务入门
  3. 视觉SLAM十四讲笔记-7-2
  4. 品牌如何借势奥运进行微博营销
  5. linux echo 命令,Linux echo 命令
  6. 计算机视觉——Harris角点检测
  7. 2010年十大最热门IT职位开源程序员上榜
  8. 一份有效的软件测试计划要怎么写?
  9. Android全屏绘制
  10. 【MySQL】 MRR