普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除。在优先队列中,元素被赋予优先级。当访问元素时,具有最高优先级的元素最先删除。优先队列具有最高级先出的行为特征。我们来说一下C++的STL queue库中优先队列的使用方法。STL默认使用<操作符来确定对象之间的优先级关系,所以如果要使用自定义对象,需要重载<操作符。优先队列有两种,一种是最大优先队列;一种是最小优先队列;每次取自队列的第一个元素分别是优先级最大和优先级最小的元素。

使用头文件queue。

优先队列的操作:

q.empty() 判断是否为空

q.size() 返回队列中元素的个数

q.pop() 删除队首元素,但不返回其值

q.top() 返回具有最高优先级的元素值,但不删除该元素

q.push() 在基于优先级的适当位置插入新元素

默认优先级为最大优先,除此之外共有3种自定义优先级方式。

  1. #include <iostream>
  2. #include <functional>
  3. #include <queue>
  4. #include <vector>
  5.  
  6. using namespace std;
  7.  
  8. struct cmp1//定义比较结构
  9. {
  10. bool operator ()(int &a,int &b)
  11. {
  12. return a>b;//最小值优先
  13. }
  14. };
  15.  
  16. struct cmp2
  17. {
  18. bool operator ()(int &a,int &b)
  19. {
  20. return a<b;//最大值优先
  21. }
  22. };
  23.  
  24. struct number1//自定义数据结构
  25. {
  26. int x;
  27.  
  28. bool operator < (const number1 &a) const
  29. {
  30. return x>a.x;//最小值优先
  31. }
  32. };
  33.  
  34. struct number2
  35. {
  36. int x;
  37.  
  38. bool operator < (const number2 &a) const
  39. {
  40. return x<a.x;//最大值优先
  41. }
  42. };
  43.  
  44. int main()
  45. {
  46. int n;
  47. cin>>n;
  48. int a[];
  49. number1 num1[];
  50. number2 num2[];
  51. for(int i=;i<n;i++)
  52. {
  53. cin>>a[i];
  54. num1[i].x=a[i];
  55. num2[i].x=a[i];
  56. }
  57. cout<<endl;
  58. priority_queue<int>Q0;//采用默认优先级构造队列
  59. priority_queue<int,vector<int>,cmp1>Q1;//最小值优先
  60. priority_queue<int,vector<int>,cmp2>Q2;//最大值优先
  61. priority_queue<int,vector<int>,greater<int> >Q3;//一定要有空格“> >”,“>>”会被认为错误
  62. priority_queue<int,vector<int>,less<int> >Q4;////最大值优先
  63. priority_queue<number1>Q5; //最小优先级队列
  64. priority_queue<number2>Q6; //最大优先级队列
  65. int i;
  66. for(i=; i<n; i++)
  67. {
  68. Q0.push(a[i]);
  69. Q1.push(a[i]);
  70. Q2.push(a[i]);
  71. Q3.push(a[i]);
  72. Q4.push(a[i]);
  73. }
  74. for(i=; i<n; i++)
  75. Q5.push(num1[i]);
  76. for(i=; i<n; i++)
  77. Q6.push(num2[i]);
  78. //采用默认优先关系 (priority_queue<int>que)
  79. cout<<"Queue0:"<<endl;
  80. while(!Q0.empty())
  81. {
  82. cout<<Q0.top()<<" ";
  83. Q0.pop();
  84. }
  85. cout<<endl<<endl;
  86. //采用结构体自定义优先级方式一 (priority_queue<int,vector<int>,cmp>que)
  87. cout<<"Queue1:"<<endl;
  88. while(!Q1.empty())
  89. {
  90. cout<<Q1.top()<<" ";
  91. Q1.pop();
  92. }
  93. cout<<endl;
  94. cout<<"Queue2:"<<endl;
  95. while(!Q2.empty())
  96. {
  97. cout<<Q2.top()<<" ";
  98. Q2.pop();
  99. }
  100. cout<<endl<<endl;
  101. //采用头文件functional内定义优先级 (priority_queue<int,vector<int>,greater<int>/less<int> >que)
  102. cout<<"Queue3:"<<endl;
  103. while(!Q3.empty())
  104. {
  105. cout<<Q3.top()<<" ";
  106. Q3.pop();
  107. }
  108. cout<<endl;
  109. cout<<"Queue4:"<<endl;
  110. while(!Q4.empty())
  111. {
  112. cout<<Q4.top()<<" ";
  113. Q4.pop();
  114. }
  115. cout<<endl<<endl;
  116. //采用结构体自定义优先级方式二 (priority_queue<number>que)
  117. cout<<"Queue5:"<<endl;
  118. while(!Q5.empty())
  119. {
  120. cout<<Q5.top().x<<" ";
  121. Q5.pop();
  122. }
  123. cout<<endl;
  124. cout<<"Queue6:"<<endl;
  125. while(!Q6.empty())
  126. {
  127. cout<<Q6.top().x<<" ";
  128. Q6.pop();
  129. }
  130. cout<<endl;
  131. return ;
  132. }

运行结果:

STL中优先队列的使用的更多相关文章

  1. STL之优先队列

    STL 中优先队列的使用方法(priority_queu) 基本操作: empty() 如果队列为空返回真 pop() 删除对顶元素 push() 加入一个元素 size() 返回优先队列中拥有的元素 ...

  2. STL中队列(queue)的使用方法

    STL 中队列的使用(queue) 基本操作: push(x) 将x压入队列的末端 pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值 front() 返回第一个元素(队顶元素) ...

  3. 手写队列以及stl中队列的使用

    一,手写队列. struct queue { ; ,rear=,a[maxn]; void push(int x) { a[++rear]=x; } void pop() { first++; } i ...

  4. 浅谈C++ STL中的优先队列(priority_queue)

    从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的. 今天讲一讲优先队列(priority_queue),实际 ...

  5. STL中heap相关函数

    heap并不是属于STL中的containers,而是在<algorithm>下提供了相关的函数 make_heap,sort_heap,pop_heap,push_heap 函数的说明: ...

  6. STL中sort、priority_queue、map、set的自定义比较函数

    STL中,sort的默认排序为less,也就是说从小到大排序:priority_queue默认是less,也就说大顶堆:map默认是less,也就说用迭代器迭代的时候默认是小的排在前面:set默认是l ...

  7. STL中六大组件

    1)容器(Container),是一种数据结构,如list,vector,和deques ,以模板类的方法提供.为了访问容器中的数据,可以使用由容器类输出的迭代器: 容器(container)用于存放 ...

  8. C++ 队列!还是要从 STL 中的说起……

    1. 前言 队列和栈一样,都是受限的数据结构. 队列遵循先进先出的存储原则,类似于一根水管,水从一端进入,再从另一端出去.进入的一端称为队尾,出去的一端称为队头. 队列有 2 个常规操作: 入队:进入 ...

  9. STL中的set容器的一点总结

    1.关于set C++ STL 之所以得到广泛的赞誉,也被很多人使用,不只是提供了像vector, string, list等方便的容器,更重要的是STL封装了许多复杂的数据结构算法和大量常用数据结构 ...

随机推荐

  1. PHP-PSR-[0-4]代码规范

    PHP-FIG 在说啥是PSR-[0-4]规范的之前,我觉得我们有必要说下它的发明者和规范者:PHP-FIG,它的网站是:www.php-fig.org.就是这个联盟组织发明和创造了PSR-[0-4] ...

  2. p 最多两行 多的显示省略号

    -webkit-line-clamp: 2 -webkit-box-orient: vertical; }

  3. AngularJS -- 代码实例

    整理书籍内容(QQ:283125476 发布者:M [重在分享,有建议请联系->QQ号]) ng-change 当文本输入字段中内容发生了变化,就会改变equation.x的值: <bod ...

  4. CF734F Anton and School (构造)

    \(solution\) : 这道题做法很巧妙,需要对位运算有足够了解: $( a $ & $ b )$ \(+\) $( a $ | $ b )$ \(=\) \(a+b\) ,所以有 \( ...

  5. javascript的this分别代表什么

    鉴于大家对this到底代表的是什么有疑问,现在将我个人理解的this的情况整理如下.有错误请指正. 第一种情况:  如果是一个全局的function,则this相当于window对象. 这个打印出来的 ...

  6. Hibernate延迟加载策略

    所谓懒加载(lazy)就是延时加载,就是当在真正需要数据的时候,才真正执行数据加载操作 至于为什么要用懒加载呢,就是当我们要访问的数据量过大时,明显用缓存不太合适,因为内存容量有限 ,为了减少并发量, ...

  7. MapReduce--shuffle

    一.Shuffle简介 Shuffle的正常意思是洗牌或弄乱,shuffle的大致范围就是把map task的输出结果有效的传送到Reduce端.也可以这样理解,shuffle描述着数据从map ta ...

  8. mongodb导出数据csv格式

    mongoexport -d test -c item --type=csv -f salary,city,workYear,companyShortName -o user.csvmongoexpo ...

  9. BAT脚本加防火墙455端口

    @echo off mode con: cols=85 lines=30 :NSFOCUSXA title WannaCry勒索病毒安全加固工具 color 0A cls echo. echo. ec ...

  10. Google Protocol Buffer的安装与.proto文件的定义(转)

    转自(https://www.cnblogs.com/yinheyi/p/6080244.html) 什么是protocol Buffer呢? Google Protocol Buffer( 简称 P ...