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,感谢大佬. 优先队列 引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解 ...
随机推荐
- java 验证日期
- color mask
https://msdn.microsoft.com/zh-cn/library/windows/desktop/bb173595(v=vs.85).aspx void OMSetBlendState ...
- nginx上如何支持.htaccess伪静态转向
我们知道在apache上有一个常用的功能.htaccess转向,只要apache编译的时候指明支持rewrite模块就可以了. 但是换到nginx上方法会有一点不一样,网上很多人说把.htaccess ...
- STMPClient 发送邮件显示 不允许使用邮件名称.
在.net 2.0,3.5, 针对某些邮箱(还不清楚是什么样的邮件) , 使用微软自带的DLL发送邮件会提示不允许使用邮件名称 .... 使用Jmail可以发送. 解决方案: 1. ...
- 关于面向对象--oop
这两天在做大数据方面的项目看到关于job作业调度的设计,扣了两天了,感触良多,记下来做个反省. 这是一个精简版的图,其中还有一些没有划到,其实到这里目前对我来说已经足够了. 看完图之后进行分析,我只抛 ...
- 用DIV+CSS切割多背景合并图片 CSS Sprites 技术
很久之前就在互联网网站和一些js插件中见过这种技术的应用,当时觉得很麻烦,就没有用,也没有去深究. 近段时间一直在做前台的一些东西,涉及到很多div+css的问题.这个东东我又碰到了,所以我花了点时间 ...
- Mac下使用Apache TCPMon
Mac下使用Apache TCPMon 参考链接: TCPMon Tutorial Anyone know how to get TCPMON working on a mac? Apache TCP ...
- zoj Fibonacci Numbers ( java , 简单 ,大数)
题目 //f(1) = 1, f(2) = 1, f(n > 2) = f(n - 1) + f(n - 2) import java.io.*; import java.util.*; imp ...
- C# 给数据库传入当前时间
DateTime time=DateTime.Now; // 存储过程中用一个 @addTime DateTime --接收DateTime 类型接收
- PYTHON发送邮件时,有的服务器不用密码认证的
#!/usr/bin/python # coding: UTF-8 import smtplib from email.mime.text import MIMEText receivers_list ...