既然是队列那么先要包含头文件#include <queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队

优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的

和队列基本操作相同:

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

定义:priority_queue<Type, Container, Functional>
Type 就是数据类型,Container 就是容器类型(Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector),Functional 就是比较的方式,当需要用自定义的数据类型时才需要传入这三个参数,使用基本数据类型时,只需要传入数据类型,默认是大顶堆
一般是:

//升序队列
priority_queue <int,vector<int>,greater<int> > q;
//降序队列
priority_queue <int,vector<int>,less<int> >q;//greater和less是std实现的两个仿函数(就是使一个类的使用看上去像一个函数。其实现就是类中实现一个operator(),这个类就有了类似函数的行为,就是一个仿函数类了)

  1. 基本类型例子:
#include<iostream>
#include <queue>
using namespace std;
int main()
{//对于基础类型 默认是大顶堆priority_queue<int> a; //等同于 priority_queue<int, vector<int>, less<int> > a;priority_queue<int, vector<int>, greater<int> > c;  //这样就是小顶堆priority_queue<string> b;for (int i = 0; i < 5; i++) {a.push(i);c.push(i);}while (!a.empty()) {cout << a.top() << ' ';a.pop();} cout << endl;while (!c.empty()) {cout << c.top() << ' ';c.pop();}cout << endl;b.push("abc");b.push("abcd");b.push("cbd");while (!b.empty()) {cout << b.top() << ' ';b.pop();} cout << endl;return 0;
}

输出

4 3 2 1 0
0 1 2 3 4
cbd abcd abc

2.pari的比较,先比较第一个元素,第一个相等比较第二个

#include <iostream>
#include <queue>
#include <vector>
using namespace std;
int main()
{priority_queue<pair<int, int> > a;pair<int, int> b(1, 2);pair<int, int> c(1, 3);pair<int, int> d(2, 5);a.push(d);a.push(c);a.push(b);while (!a.empty()) {cout << a.top().first << ' ' << a.top().second << '\n';a.pop();}
}

输出

2 5
1 3
1 2

3.对于自定义类型

#include <iostream>
#include <queue>
using namespace std;//方法1
struct tmp1 //运算符重载<
{int x;tmp1(int a) {x = a;}bool operator<(const tmp1& a) const{return x < a.x; //大顶堆}
};//方法2
struct tmp2 //重写仿函数
{bool operator() (tmp1 a, tmp1 b) {return a.x < b.x; //大顶堆}
};int main()
{tmp1 a(1);tmp1 b(2);tmp1 c(3);priority_queue<tmp1> d;d.push(b);d.push(c);d.push(a);while (!d.empty()) {cout << d.top().x << '\n';d.pop();}cout << endl;priority_queue<tmp1, vector<tmp1>, tmp2> f;f.push(c);f.push(b);f.push(a);while (!f.empty()) {cout << f.top().x << '\n';f.pop();}
}

输出

3
2
13
2
1

c++优先队列(priority_queue)用法详解相关推荐

  1. 优先队列priority_queue 用法详解

    优先队列priority_queue 用法详解 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达 ...

  2. 【转】c++优先队列(priority_queue)用法详解

    既然是队列那么先要包含头文件#include <queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队 优先队列具有队列的所有特性, ...

  3. python argv 详解_Python3 sys.argv[ ]用法详解

    sys.argv[]说白了就是一个从程序外部获取参数的桥梁,这个"外部"很关键,因为我们从外部取得的参数可以是多个,所以获得的是一个列表(list),也就是说sys.argv其实可 ...

  4. oracle中的exists 和 not exists 用法详解

    from:http://blog.sina.com.cn/s/blog_601d1ce30100cyrb.html oracle中的exists 和 not exists 用法详解 (2009-05- ...

  5. ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多)

    ROW_NUMBER() OVER()函数用法详解 (分组排序 例子多) https://blog.csdn.net/qq_25221835/article/details/82762416 post ...

  6. python的继承用法_【后端开发】python中继承有什么用法?python继承的用法详解

    本篇文章给大家带来的内容是关于python中继承有什么用法?python继承的用法详解,有一定的参考价值,有需要的朋友可以参考一下,希望对你有所帮助. 面向对象三大特征 1.封装:根据职责将属性和方法 ...

  7. C++中substr()函数用法详解

    C++中substr()函数用法详解 原型: string substr (size_t pos = 0, size_t len = npos) const; 返回一个新构造的string对象,其值初 ...

  8. php theme_path,PHP_Yii2主题(Theme)用法详解,本文实例讲述了Yii2主题(Theme) - phpStudy

    Yii2主题(Theme)用法详解 本文实例讲述了Yii2主题(Theme)用法.分享给大家供大家参考,具体如下: 首先看看主要的配置方式: 'components' => [ 'view' = ...

  9. LayoutInflater的inflate函数用法详解

    LayoutInflater的inflate函数用法详解 LayoutInflater作用是将layout的xml布局文件实例化为View类对象. 获取LayoutInflater的方法有如下三种: ...

最新文章

  1. openstack学习笔记五 多节点部署之 rabbitmq信息中枢与元数据
  2. 微信关闭html5游戏吗,5月20日起,微信将彻底关闭这个功能!
  3. 天地图 热力图_arcgis js 3.x使用webgl绘制热力图
  4. Ultraedit使用技巧收集
  5. 程序员为啥365天都背电脑包?这答案我服!
  6. dataset的去重计数 g2_向工程渣土运输车辆计数 漏洞损失说“不”
  7. A8下超级终端调试问题
  8. 关于 react createFactory 的小技巧
  9. 10本Java网站开发必看书籍
  10. x99对应服务器芯片,x99主板配什么cpu 几款x99主板介绍【详细介绍】
  11. 深度学习——提升模型泛化能力的方法
  12. Java项目:SSH学生请假管理系统
  13. 台式电脑插入耳机听不到声音,排除耳机问题
  14. Android | 说说Presentation
  15. 某计算机地址总线宽度为32位,这台计算机能够寻址的内存单元是多少?,某计算机地址总线宽度为32位,这台计算机能够寻址的内存单元是多少?...
  16. RN 与android原生交互
  17. mysql 给表添加唯一约束、联合唯一约束,指定唯一约束的名字
  18. multisim14晶振在哪里_晶体谐振器在multisim中怎么找到
  19. “F5G+EIoT“构建能源物联网,助力电力物联网数据服务
  20. 蓝牙查看接收到GIF格式的图片报错问题

热门文章

  1. 天天ASP开发网完成拼车网项目开发
  2. 外媒:俄侦委已就劫机事件向嫌疑人提出指控
  3. linux系统下的ocr软件,【工具类】Linux安装OCR识别工具tesseract
  4. Docker 知识点总结(一)
  5. RSA 非对称加密算法详细介绍
  6. 命令行计算机ipconfig,ipconfig命令,详细教您ipconfig命令怎么使用
  7. 空余时间在家做娱乐搞笑短视频,一部手机就行,稳定每天200多
  8. windows下dos常用命令集合
  9. node ping ip
  10. 管理系统中计算机应用 应用题,管理系统中计算机应用---应用题.doc