priority_queue本质是一个堆。

1. 头文件是#include<queue>

2. 关于priority_queue中元素的比较

  模板申明带3个参数:priority_queue<Type, Container, Functional>,其中Type 为数据类型,Container为保存数据的容器,Functional 为元素比较方式。

  Container必须是用数组实现的容器,比如vector,deque等等,但不能用 list。STL里面默认用的是vector。

2.1 比较方式默认用operator<,所以如果把后面2个参数缺省的话,优先队列就是大顶堆(降序),队头元素最大。特别注意pair的比较函数

  以下代码返回一个降序输出:

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 int main(){
 5     priority_queue<int> q;
 6     for( int i= 0; i< 10; ++i ) q.push(i);
 7     while( !q.empty() ){
 8         cout<<q.top()<<endl;
 9         q.pop();
10     }
11     return 0;
12 }

 

  以下代代码返回pair的比较结果,先按照pair的first元素降序,first元素相等时,再按照second元素降序:

 1 #include<iostream>
 2 #include<vector>
 3 #include<queue>
 4 using namespace std;
 5 int main(){
 6     priority_queue<pair<int,int> > coll;
 7     pair<int,int> a(3,4);
 8     pair<int,int> b(3,5);
 9     pair<int,int> c(4,3);
10     coll.push(c);
11     coll.push(b);
12     coll.push(a);
13     while(!coll.empty())
14     {
15         cout<<coll.top().first<<"\t"<<coll.top().second<<endl;
16         coll.pop();
17     }
18     return 0;
19 }

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

  以下代码返回一个升序输出:

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 int main(){
 5     priority_queue<int, vector<int>, greater<int> > q;
 6     for( int i= 0; i< 10; ++i ) q.push(10-i);
 7     while( !q.empty() ){
 8         cout << q.top() << endl;
 9         q.pop();
10     }
11     return 0;
12 }

  以下代代码返回pair的比较结果,先按照pair的first元素升序,first元素相等时,再按照second元素升序:

 1 #include<iostream>
 2 #include<vector>
 3 #include<queue>
 4 using namespace std;
 5 int main(){
 6     priority_queue<pair<int,int>,vector<pair<int,int> >,greater<pair<int,int> > > coll;
 7     pair<int,int> a(3,4);
 8     pair<int,int> b(3,5);
 9     pair<int,int> c(4,3);
10     coll.push(c);
11     coll.push(b);
12     coll.push(a);
13     while(!coll.empty())
14     {
15         cout<<coll.top().first<<"\t"<<coll.top().second<<endl;
16         coll.pop();
17     }
18     return 0;
19 }

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

2.3.1 重载operator<的例子:返回true时,说明左边形参的优先级低于右边形参

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 struct Node{
 5     int x, y;
 6     Node(int a=0, int b=0):
 7         x(a),y(b){}
 8 };
 9 bool operator<(Node a, Node b){//返回true时,说明a的优先级低于b
10     //x值较大的Node优先级低(x小的Node排在队前)
11     //x相等时,y大的优先级低(y小的Node排在队前)
12     if( a.x== b.x ) return a.y> b.y;
13     return a.x> b.x;
14 }
15 int main(){
16     priority_queue<Node> q;
17     for( int i= 0; i< 10; ++i )
18     q.push( Node( rand(), rand() ) );
19     while( !q.empty() ){
20         cout << q.top().x << ' ' << q.top().y << endl;
21         q.pop();
22     }
23     return 0;
24 }

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

但此时不能像基本类型这样声明priority_queue<Node,vector<Node>,greater<Node> >,原因是greater<Node>没有定义,如果想用这种方法定义则可以重载operator >。

例子:返回的是小顶堆。但不怎么用,习惯是重载operator<。

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 struct Node{
 5     int x, y;
 6     Node( int a= 0, int b= 0 ):
 7         x(a), y(b) {}
 8 };
 9 bool operator>( Node a, Node b ){//返回true,a的优先级大于b
10     //x大的排在队前部;x相同时,y大的排在队前部
11     if( a.x== b.x ) return a.y> b.y;
12     return a.x> b.x;
13 }
14 int main(){
15     priority_queue<Node,vector<Node>,greater<Node> > q;
16     for( int i= 0; i< 10; ++i )
17     q.push( Node( rand(), rand() ) );
18     while( !q.empty() ){
19         cout << q.top().x << ' ' << q.top().y << endl;
20         q.pop();
21     }
22     return 0;
23 }

2.3.2 重写仿函数的例子(返回值排序与2.3.1相同,都是小顶堆。先按x升序,x相等时,再按y升序):

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 struct Node{
 5     int x, y;
 6     Node( int a= 0, int b= 0 ):
 7         x(a), y(b) {}
 8 };
 9 struct cmp{
10     bool operator() ( Node a, Node b ){//默认是less函数
11         //返回true时,a的优先级低于b的优先级(a排在b的后面)
12         if( a.x== b.x ) return a.y> b.y;
13         return a.x> b.x; }
14 };
15 int main(){
16     priority_queue<Node, vector<Node>, cmp> q;
17     for( int i= 0; i< 10; ++i )
18     q.push( Node( rand(), rand() ) );
19     while( !q.empty() ){
20         cout << q.top().x << ' ' << q.top().y << endl;
21         q.pop();
22     }
23     return 0;
24 } 

参考:http://www.cnblogs.com/flyoung2008/articles/2136485.html

转载于:https://www.cnblogs.com/Deribs4/p/5657746.html

priority_queue的用法相关推荐

  1. priority_queue 用法总结

    今天在写堆和哈夫曼树的ACM题的时候,接触到priority_queue的用法,由于比较函数的难些,请教过队内的红薯和杨大牛后才稍微弄明白些,下面总结如下,首先我是用手写的堆来过题的,其实和照黑书指导 ...

  2. c++ stl容器vector删除(erase),遍历等基本用法介绍及头文件

    Vectors 包含着一系列连续存储的元素,其行为和数组类似.访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线 ...

  3. 理解至上:二叉堆与优先队列详细用法

    文章目录 二叉堆 概述 插入 代码 访问 代码 完整代码 优先队列:priority_queue 基本用法 小根堆的声明: 结构体 注意 Thanks for reading! 二叉堆 概述 为什么不 ...

  4. C++ queue和priority_queue

    queue 和 priority_queue 都是容器适配器,要使用它们,必须包含头文件 . queue queue 就是"队列".队列是先进先出的,和排队类似.队头的访问和删除操 ...

  5. STL-priority_queue用法(重点: 升序,小根堆)

    文章出处:http://www.cnblogs.com/mfryf/archive/2012/09/05/2671883.html STL-priority_queue用法(重点: 升序,小根堆) 昨 ...

  6. C++_STL——stack

    C++_STL--stack template <class T, class Container = deque<T> > class stack; 堆栈 后进先出堆栈 堆栈 ...

  7. 今日头条的面试题(部分)

    1.给定一个有序数组,输出平方后消重结果中数字的个数,每次删除一个最大的数 比如: -2, -2, -1,0,1消重后有3个数: 0,0,1,2,3,4,5,5,6消重后有7个数 O(n)复杂度解法: ...

  8. nyoj55懒省事的小明

    这个题没啥特别的,思想特别简单,就是我们学数据结构的时候,那里面的哈夫曼树的思想,从一组数里面选两个最小的相加,将这两个数从这组数中删除,再将这两个数的和放进去,再从这组数中选两个最小的数以此类推, ...

  9. C++ priority_queue用法

    列举了四种用法,分别是默认降序.内置的greater升序.重载<运算符.仿函数. #include <cstdio> #include <cstring> #includ ...

最新文章

  1. windows server2008 双线接入设置(电信联通双线)
  2. linux c warning 'XXX' declared 'static' but never defined解决方法
  3. 为什么有的人知道很多却一事无成?
  4. 一文弄懂各种loss function
  5. 深度学习需要注意的11个方面
  6. 计算机的网络技术的普及,计算机网络技术的普及与应用-网络技术论文-计算机论文(7页)-原创力文档...
  7. ICCV2021-PiT-池化操作不是CNN的专属,ViT说:“我也可以”;南大提出池化视觉Transformer(PiT)...
  8. MySQL+Hibernate下连接空闲8小时自动断开问题解决方案
  9. 使用LoadRunner进行性能测试的简单步骤
  10. 《Web测试囧事》——1.3 测试Web Service能否正常提供JSON数据
  11. 向量叉乘的几何意义及其模的计算
  12. easyswoole入门
  13. rtx2060什么水平_老平台升级RTX2060,——性能,功耗,静音都一步到位!
  14. 9.ffplayer 原理、架构及代码分析——变速播放的实现
  15. 瑞利散射 拉曼散射 米散射_使用Cartopy的时移散射图可视化
  16. Python用turtle画爱心丘比特之剑
  17. 健美计步器-开启超智能健康生活
  18. LeetCode第 621 题:任务调度器 (C++)
  19. 更智能!AIRIOT加速煤炭行业节能减排升级
  20. 谈谈海外移动支付普及的一点障碍

热门文章

  1. Java入门算法(滑动窗口篇)丨蓄力计划
  2. 用递归调用法求斐波那契函数_进阶版:面试官问你斐波那契数列的时候不要高兴得太早...
  3. java radiobutton获取信息_如何获取JRadioButton的文本值
  4. mysql的c接口_mysql C接口大全
  5. 计算机组成与维修考试试题,期末考试试题计算机组成与维修.doc
  6. php抑制错误,PHP 行内错误抑制
  7. 台达b2伺服说明书_三菱Q系列定位模块及伺服参数不会设置?看这一篇就够了!...
  8. 「第四篇」电赛控制题可以准备一些什么?
  9. 电子设计竞赛(7)-2017年电赛A题:微电网模拟系统教程
  10. 48岁的C语言,你知道它背后的历史吗?