一、相关定义

优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素。但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队。这点类似于给队列里的元素进行了由大到小的顺序排序。元素的比较规则默认按元素值由大到小排序,可以重载“<”操作符来重新定义比较规则。

优先级队列可以用向量(vector)或双向队列(deque)来实现(注意list container不能用来实现queue,因为list的迭代器不是任意存取iterator,而pop中用到堆排序时是要求randomaccess iterator 的!):
priority_queue<vector<int>, less<int> > pq1;     // 使用递增less<int>函数对象排序
priority_queue<deque<int>, greater<int> > pq2;   // 使用递减greater<int>函数对象排序
其成员函数有“判空(empty)” 、“尺寸(Size)” 、“栈顶元素(top)” 、“压栈(push)” 、“弹栈(pop)”等。

二、priority_queue

基本操作:

empty()      如果队列为空,则返回真

pop()    删除对顶元素,删除第一个元素

push()        加入一个元素

size()      返回优先队列中拥有的元素个数

top()     返回优先队列对顶元素,返回优先队列中有最高优先级的元素

在默认的优先队列中,优先级高的先出队。在默认的int型中先出队的为较大的数。

头文件:

#include <queue>

声明方式:

1、普通方法:

priority_queue<int> q;                 //通过操作,按照元素从大到小的顺序出队
priority_queue<int,vector<int>, greater<int> > q;    //通过操作,按照元素从小到大的顺序出队

2、自定义优先级:

struct cmp {     
  operator bool ()(int x, int y)     
  {        
     return x > y;   // x小的优先级高       //也可以写成其他方式,如: return p[x] > p[y];表示p[i]小的优先级高
  }
};
priority_queue<int, vector<int>, cmp> q;    //定义方法
//其中,第二个参数为容器类型。第三个参数为比较函数。

3、结构体声明方式:

struct node {     
  int x, y;     
  friend bool operator < (node a, node b)     
  {         
    return a.x > b.x;    //结构体中,x小的优先级高     
  }
};
priority_queue<node>q;   //定义方法
//在该结构中,y为值, x为优先级。
//通过自定义operator<操作符来比较元素中的优先级。
//在重载”<”时,最好不要重载”>”,可能会发生编译错误
 
三、代码实现
  1. 优先队列,其构造及具体实现我们可以先不用深究,我们现在只需要了解其特性,及在做题中的用法。
    以一个例子来解释吧(呃,写完才发现,这个代码包函了几乎所有我们要用到的用法,仔细看看吧):
  1. /*优先队列的基本使用 2017/8/1 xzxl*/
  2. #include<stdio.h>
  3. #include<functional>
  4. #include<queue>
  5. #include<vector>
  6. using namespace std;
  7. //定义结构,使用运算符重载,自定义优先级1
  8. struct cmp1{
  9. bool operator ()(int &a,int &b){
  10. return a>b;//最小值优先
  11. }
  12. };
  13. struct cmp2{
  14. bool operator ()(int &a,int &b){
  15. return a<b;//最大值优先
  16. }
  17. };
  18. //定义结构,使用运算符重载,自定义优先级2
  19. struct number1{
  20. int x;
  21. bool operator < (const number1 &a) const {
  22. return x>a.x;//最小值优先
  23. }
  24. };
  25. struct number2{
  26. int x;
  27. bool operator < (const number2 &a) const {
  28. return x<a.x;//最大值优先
  29. }
  30. };
  31. int a[]={14,10,56,7,83,22,36,91,3,47,72,0};
  32. number1 num1[]={14,10,56,7,83,22,36,91,3,47,72,0};
  33. number2 num2[]={14,10,56,7,83,22,36,91,3,47,72,0};
  34.  
  35. int main()
  36. { priority_queue<int>que;//采用默认优先级构造队列
  37.  
  38. priority_queue<int,vector<int>,cmp1>que1;//最小值优先
  39. priority_queue<int,vector<int>,cmp2>que2;//最大值优先
  40.  
  41. priority_queue<int,vector<int>,greater<int> >que3;//注意“>>”会被认为错误,
  42. //这是右移运算符,所以这里用空格号隔开
  43. priority_queue<int,vector<int>,less<int> >que4;////最大值优先
  44.  
  45. priority_queue<number1>que5;
  46. priority_queue<number2>que6;
  47.  
  48. int i;
  49. for(i=0;a[i];i++){
  50. que.push(a[i]);
  51. que1.push(a[i]);
  52. que2.push(a[i]);
  53. que3.push(a[i]);
  54. que4.push(a[i]);
  55. }
  56. for(i=0;num1[i].x;i++)
  57. que5.push(num1[i]);
  58. for(i=0;num2[i].x;i++)
  59. que6.push(num2[i]);
  60.  
  61. printf("采用默认优先关系:\n(priority_queue<int>que;)\n");
  62. printf("Queue 0:\n");
  63. while(!que.empty()){
  64. printf("%3d",que.top());
  65. que.pop();
  66. }
  67. puts("");
  68. puts("");
  69.  
  70. printf("采用结构体自定义优先级方式一:\n(priority_queue<int,vector<int>,cmp>que;)\n");
  71. printf("Queue 1:\n");
  72. while(!que1.empty()){
  73. printf("%3d",que1.top());
  74. que1.pop();
  75. }
  76. puts("");
  77. printf("Queue 2:\n");
  78. while(!que2.empty()){
  79. printf("%3d",que2.top());
  80. que2.pop();
  81. }
  82. puts("");
  83. puts("");
  84. printf("采用头文件\"functional\"内定义优先级:\n(priority_queue<int,vector<int>,greater<int>/less<int> >que;)\n");
  85. printf("Queue 3:\n");
  86. while(!que3.empty()){
  87. printf("%3d",que3.top());
  88. que3.pop();
  89. }
  90. puts("");
  91. printf("Queue 4:\n");
  92. while(!que4.empty()){
  93. printf("%3d",que4.top());
  94. que4.pop();
  95. }
  96. puts("");
  97. puts("");
  98. printf("采用结构体自定义优先级方式二:\n(priority_queue<number>que)\n");
  99. printf("Queue 5:\n");
  100. while(!que5.empty()){
  101. printf("%3d",que5.top());
  102. que5.pop();
  103. }
  104. puts("");
  105. printf("Queue 6:\n");
  106. while(!que6.empty()){
  107. printf("%3d",que6.top());
  108. que6.pop();
  109. }
  110. puts("");
  111. return 0;
  112. }
  113. /*
  114. 运行结果 :
  115. 采用默认优先关系:
  116. (priority_queue<int>que;)
  117. Queue 0:
  118. 83 72 56 47 36 22 14 10 7 3
  119.  
  120. 采用结构体自定义优先级方式一:
  121. (priority_queue<int,vector<int>,cmp>que;)
  122. Queue 1:
  123. 7 10 14 22 36 47 56 72 83 91
  124. Queue 2:
  125. 83 72 56 47 36 22 14 10 7 3
  126.  
  127. 采用头文件"functional"内定义优先级:
  128. (priority_queue<int,vector<int>,greater<int>/less<int> >que;)
  129. Queue 3:
  130. 7 10 14 22 36 47 56 72 83 91
  131. Queue 4:
  132. 83 72 56 47 36 22 14 10 7 3
  133.  
  134. 采用结构体自定义优先级方式二:
  135. (priority_queue<number>que)
  136. Queue 5:
  137. 7 10 14 22 36 47 56 72 83 91
  138. Queue 6:
  139. 83 72 56 47 36 22 14 10 7 3
  140. */

  

C++STL——优先队列的更多相关文章

  1. CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆)

    CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆) Description 有n个函数,分别为F1,F2,...,Fn.定义 \(Fi(x)=Aix^2+Bix ...

  2. CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)

    CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...

  3. 基于STL优先队列和邻接表的dijkstra算法

    首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...

  4. poj 3253 Fence Repair (STL优先队列)

    版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/34805369 转载请注明出 ...

  5. UVA - 136 Ugly Numbers(丑数,STL优先队列+set)

    Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9 ...

  6. 合并果子(STL优先队列)

    STL优先队列:priority_queue 定义:priority_queue<int>q; 从小到大:priority_queue<int,vector<int>,g ...

  7. STL 优先队列

    STL 栈,队列,优先队列用法 分类: Learning C++2013-11-15 00:52 843人阅读 评论(2) 收藏 举报 c++栈队列优先队列STL STL 中栈的使用方法(stack) ...

  8. STL优先队列的使用

    STL中有一个优先队列的容器可以使用. [头文件] queue 队列容器 vector 向量容器 [操作] 优先级队列支持的操作 q.empty()         如果队列为空,则返回true,否则 ...

  9. POJ 3253 Fence Repair STL 优先队列

    这题做完后觉得很水,主要的想法就是逆过程思考,原题是截断,可以想成是拼装,一共有n根木棍,最后要拼成一根完整的,每两根小的拼成一根大的,拼成后的木棍长度就是费用,要求费用最少.显然的是一共会拼接n-1 ...

  10. STL优先队列——踩坑日记

    priority_queue 可以定义STL中的优先队列,但是优先队列在应用于自己定义的类型时需要重载<运算符,或者通过仿函数来定义比较方法,在定义比较方法的过程中,比较大的坑是STL中对于参数 ...

随机推荐

  1. WCF REST模式下的UriTemplate路径问题

    问题:在WCF4.0中,用UriTemplate进行表明路径参数的时候会出现问题 1.创建的项目是Service.Interface[4.0]和Service[4.0]还有Client[4.0] 2. ...

  2. Redis的安装和Jedis的使用

    Redis的安装和学习资料 Redis的安装可以参考 https://www.cnblogs.com/dddyyy/p/9763098.html Redis的学习可以参考https://www.cnb ...

  3. 初探InnoDB MVCC源码实现

    1. 背景 本文基于MySQL InnoDB源码对InnoDB中非锁定一致性读是如何实现的作一些简单的探究. 2. 基本概念 2.1 隐藏字段 在经典之作<高性能MySQL>的1.4节中提 ...

  4. 【剑指offer】推断二叉树平衡

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/mmc_maodun/article/details/27242575 转载请注明出处:http:// ...

  5. 每周一个linux命令之---uptime详解

    每周一个linux命令之---uptime详解 linux命令 uptime详解 引言:从今天开始,每周更新一个对程序员有用的linux命令,我真的没敢写每天一个,我怕我坚持不下去,每周一个还是可以的 ...

  6. Plotagraph软件五分钟光速速成傻瓜教程

    http://bbs.dji.com/thread-144203-1-1.html 让照片变成动态的

  7. infura的使用

    infura 官网: https://infura.io/本地安装geth的方法需要花比较多的时间和空间来同步区块,利用infura可以简单很多,infura提供公开以太坊和测试节点,可以利用infu ...

  8. css学习之样式层级和权重

    第一种情况 当选择器相同的情况下,引入方式的前后,决定页面最后的效果 ---------外部在最后面显示 ---------内部在最后面显示 第二种情况 引入方式相同时候,则是按照权重取最大(取权重最 ...

  9. JavaScript高级程序设计学习(三)之变量、作用域和内存问题

    这次讲的主要是变量,作用域和内存问题. 任何一门编程语言,都涉及这三个. 变量,比如全局变量,局部变量等,作用域,也分全局作用域和方法作用域,内存问题,在java中就涉及到一个垃圾回收的问题,由于ja ...

  10. 深入浅出的webpack构建工具---ParallelUglifyPlugin优化压缩(十)

    webpack默认提供了UglifyJS插件来压缩JS代码,但是它使用的是单线程压缩代码,也就是说多个js文件需要被压缩,它需要一个个文件进行压缩.所以说在正式环境打包压缩代码速度非常慢(因为压缩JS ...