C++ STL之priority_queue
STL中的priority_queue(优先队列)是一种会按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序的容器,不同优先级的情况下,top()上永远是最高优先级的数据,其底层采用的是堆结构(默认大顶堆)。注意相同优先级下并没有先进先出,后面的例子中可以看到
头文件#include<queue>
标准库默认使用元素类型的<操作符来确定它们之间的优先级关系,数据越大优先级越高,想要改变优先级的界定方式的话需要重载<操作符。
先看个最简单的:
#include<iostream>
#include<queue>
using namespace std; int main()
{
priority_queue<int>pq;
pq.push();
pq.push();
pq.push();
pq.push();
pq.push();
pq.push();
while(!pq.empty())
{
cout<<pq.top()<<endl;
pq.pop();
}
return ;
}
运行结果:

下面再看一个例子:
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int value;
int pro;
friend bool operator <(node n1,node n2)//自定义priority_queue结构中优先级的界定方式
{
return n1.pro<n2.pro;
}
};
int main()
{
priority_queue<node>pq;
node temp; temp.pro=;
temp.value=;
pq.push(temp); temp.pro=;
temp.value=;
pq.push(temp); temp.pro=;
temp.value=;
pq.push(temp); temp.pro=;
temp.value=;
pq.push(temp); temp.pro=;
temp.value=;
pq.push(temp); temp.pro=;
temp.value=;
pq.push(temp); while(!pq.empty())
{
cout<<pq.top().pro<<" "<<pq.top().value<<endl;
pq.pop();
}
return ;
}
结果:

从这个例子中可以看到,对于相同优先级的三个pro值为4的结构体,输入顺序中value值依次为11,9,5,而输出确实5,11,9,所以相同优先级的情况下并没有先进先出。
如果想把底层改成小顶堆结构,需要重载<就可以了,如下面的例子:
#include<iostream>
#include<queue>
using namespace std;
struct node
{
int value;
int pro;
friend bool operator <(node n1,node n2)//自定义priority_queue结构中优先级的界定方式
{
return n1.pro>n2.pro;
}
};
int main()
{
priority_queue<node>pq;
node temp; temp.pro=;
temp.value=;
pq.push(temp); temp.pro=;
temp.value=;
pq.push(temp); temp.pro=;
temp.value=;
pq.push(temp); temp.pro=;
temp.value=;
pq.push(temp); temp.pro=;
temp.value=;
pq.push(temp); temp.pro=;
temp.value=;
pq.push(temp); while(!pq.empty())
{
cout<<pq.top().pro<<" "<<pq.top().value<<endl;
pq.pop();
}
return ;
}
结果如下:

最后吐槽一下,priority_queue为什么会是一种queue呢?从它上面我根本没看到队列先进先出的特点。
C++ STL之priority_queue的更多相关文章
- STL之priority_queue(优先队列)
priority_queue是一个容器适配器,在这个容器里第一个数据元素是最大的.它的使用场景是什么样:如果12306抢票,为什么黄牛能抢这么多票,感觉12306那边的请求队列是一个优先队列,黄牛的请 ...
- STL中priority_queue小结
(1)为了运用priority_queue,你必须包含头文件<queue>:#include<queue> (2)在头文件中priority_queue定义如下: namesp ...
- STL之priority_queue使用简介
优先队列容器也是一种从一端入队,另一端出对的队列.不同于一般队列的是,队列中最大的元素总是位于队首位置,因此,元素的出对并非按照先进先出的要求,将最先入队的元素出对,而是将当前队列中的最大元素出对. ...
- STL 中priority_queue小结
(1)为了运用priority_queue,你必须包含头文件<queue>:#include<queue> (2)在头文件中priority_queue定义如下: nam ...
- 【转载】STL之priority_queue
参考资料:传送门先回顾队列的定义:队列(queue)维护了一组对象,进入队列的对象被放置在尾部,下一个被取出的元素则取自队列的首部.priority_queue特别之处在于,允许用户为队列中存储的元素 ...
- STL之priority_queue
下面以 long long 型队列介绍: Q.empty() // 判断队列是否为空 返回ture表示空 返回false表示空 bool Q.top() // 返回顶端元素的值 元素还在队列里 lon ...
- 【STL】-priority_queue的用法
初始化: priority_queue<int> maxPQ; priority_queue<int,vector<int& ...
- STL之priority_queue为复合结构排序
priority_queue为复合结构排序: #include <iostream> #include <queue> using namespace std; struct ...
- C++ STL 优先队列 priority_queue 详解(转)
转自https://blog.csdn.net/c20182030/article/details/70757660,感谢大佬. 优先队列 引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解 ...
随机推荐
- Leetcode#148 Sort List
原题地址 链表归并排序 真是恶心的一道题啊,哇了好多次才过. 代码: void mergeList(ListNode *a, ListNode *b, ListNode *&h, ListNo ...
- 【bzoj1002】[FJOI2007]轮状病毒
1002: [FJOI2007]轮状病毒 Time Limit: 1 Sec Memory Limit: 162 MBSubmit: 4381 Solved: 2393[Submit][Statu ...
- HTML5 canvas 绘图步骤
1.先把canvas选出来,不选出来你往哪儿画! var oCan= document.getElementById('xxx'); 2.声明基于 canvas 的context对象,没他你怎么调用 ...
- Linux Rsync
一.Rsync介绍 1.什么是Rsync Rsync 即Remote Rynchronization,是一款开源的.快速的.多功能的.可实现全量或增量的本地或者远程数据镜像同步复制.备份的优秀工具. ...
- 使用Ninject来解决程序中组件的耦合问题
1.为什么要用Ninject? Ninject是一个IOC容器用来解决程序中组件的耦合问题,它的目的在于做到最少配置.其他的的IOC工具过于依赖配置文件,需要使用assembly-qualified名 ...
- js&html5实现消星星游戏
前段时间看见园子里有同学用js+jquery实现了消星星游戏,自己也早有这个想法,于是就利用业余时间用js+html5实现了一下消星星游戏. 主要是想实现效果,运用了css3中的动画属性.游戏积分算法 ...
- How a woman's glance can tell a man if she's interested
How a woman's glance can tell a man if she's interested揭秘:女人是否喜欢你?看眼神就知道The female mind has always b ...
- jsp中如何用jstl实现if(){}else if(){}else{}
<c:choose> <c:when test="${条件}"> 情况1........... </c:when> <c:when tes ...
- 将EXE作为资源,然后在释放到磁盘上并运行该exe程序(使用了FindResource,LoadResource,然后用CFile写成一个文件)
// 将exe作为资源加入,然后再释放出来,并运行 try { HRSRC hRes = FindResource(NULL, MAKEINTRESOURCE(IDR_EXE1), _T(" ...
- Android:开发环境
一.JAVA SDK(JDK)的安装 http://www.cnblogs.com/tinyphp/p/3664598.html 二.ADT-Bundle 包含了Eclipse.ADT插件和SDK T ...