C++ STL 优先队列 priority_queue 详解(转)
转自https://blog.csdn.net/c20182030/article/details/70757660,感谢大佬。
优先队列
引入
优先队列是一种特殊的队列,在学习堆排序的时候就有所了解,点“击”查看。
那么优先队列是什么呢?
说白了,就是一种功能强大的队列。
它的功能强大在哪里呢?
四个字:自动排序。
优先队列的头文件&&声明
首先,你需要
#include<queue>
using namespace std;
这两个头文件。
其次,一个优先队列声明的基本格式是:
priority_queue<结构类型> 队列名;
比如:
priority_queue <int> i;
priority_queue <duble> d;
不过,我们最为常用的是这几种:
priority_queue <node> q;
//node是一个结构体
//结构体里重载了‘<’小于符号
priority_queue <int,vector<int>,greater<int> > q;
//不需要#include<vector>头文件
//注意后面两个“>”不要写在一起,“>>”是右移运算符
priority_queue <int,vector<int>,less<int> >q;
我们将在下文来讲讲这几种声明方式的不同。
优先队列的基本操作
以一个名为q的优先队列为例。
q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素
q.back();//返回q的末尾元素
优先队列的特性
上文已经说过了,自动排序。
怎么个排法呢?
在这里介绍一下:
默认的优先队列(非结构体结构)
priority_queue <int> q;
这样的优先队列是怎样的?让我们写程序验证一下。
#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int> q;
int main()
{
q.push(10),q.push(8),q.push(12),q.push(14),q.push(6);
while(!q.empty())
printf("%d ",q.top()),q.pop();
}
程序大意就是在这个优先队列里依次插入10、8、12、14、6,再输出。
结果是什么呢? 14 12 10 8 6
也就是说,它是按从大到小排序的!
默认的优先队列(结构体,重载小于)
先看看这个结构体是什么。
struct node
{
int x,y;
bool operator < (const node & a) const
{
return x<a.x;
}
};
这个node结构体有两个成员,x和y,它的小于规则是x小者小。
再来看看验证程序:
#include<cstdio>
#include<queue>
using namespace std;
struct node
{
int x,y;
bool operator < (const node & a) const
{
return x<a.x;
}
} k;
priority_queue <node> q;
int main()
{
k.x=10,k.y=100;
q.push(k);
k.x=12,k.y=60;
q.push(k);
k.x=14,k.y=40;
q.push(k);
k.x=6,k.y=80;
q.push(k);
k.x=8,k.y=20;
q.push(k);
while(!q.empty())
{
node m=q.top();
q.pop();
printf("(%d,%d) ",m.x,m.y);
}
}
程序大意就是插入(10,100),(12,60),(14,40),(6,20),(8,20)这五个node。
再来看看它的输出:
(14,40) (12,60) (10,100) (8,20) (6,80)
它也是按照重载后的小于规则,从大到小排序的。
less和greater优先队列
还是以int为例,先来声明:
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;
话不多说,上程序和结果:
#include<cstdio>
#include<queue>
using namespace std;
priority_queue <int,vector<int>,less<int> > p;
priority_queue <int,vector<int>,greater<int> > q;
int a[5]= {10,12,14,6,8};
int main()
{
for(int i=0; i<5; i++)
p.push(a[i]),q.push(a[i]); printf("less<int>:")
while(!p.empty())
printf("%d ",p.top()),p.pop(); pritntf("\ngreater<int>:")
while(!q.empty())
printf("%d ",q.top()),q.pop();
}
结果:
less<int>:14 12 10 8 6
greater<int>:6 8 10 12 14
所以,我们可以知道,less是从大到小,greater是从小到大。
作个总结
为了方便,在平时,建议大家写:
priority_queue<int,vector<int>,less<int> >q;
priority_queue<int,vector<int>,greater<int> >q;
平时如果用从大到小不用后面的vector<int>,less<int>,可能到时候要改成从小到大,你反而会搞忘怎么写greater<int>,反而得不偿失。
总结
优先队列到此就作了个小结。
其实不管是队列,还是优先队列,都不仅仅只有我讲的这些,还有更多可以探索。
学,无止境。
C++ STL 优先队列 priority_queue 详解(转)的更多相关文章
- 【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动
一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的 ...
- 优先队列priority_queue详解
转载链接
- STL bind1st bind2nd详解
STL bind1st bind2nd详解 先不要被吓到,其实这两个配接器很简单.首先,他们都在头文件<functional>中定义.其次,bind就是绑定的意思,而1st就代表fir ...
- C++ STL bitset 容器详解
C++ STL bitset 容器详解 本篇随笔讲解\(C++STL\)中\(bitset\)容器的用法及常见使用技巧. \(bitset\)容器概论 \(bitset\)容器其实就是个\(01\)串 ...
- 2.3 C++STL vector容器详解
文章目录 2.3.1 引入 2.3.2 代码实例 2.3.3 运行结果 总结 2.3.1 引入 vector 容器 动态数组 可变数组 vector容器 单口容器(尾部操作效率高) vector动态增 ...
- multimap 和priority_queue详解
上一期是关于STL和并查集结合的例题,也附了STL中部分容器的使用摘要,由于是从网上东拼西凑的,感觉有的关键点还是没解释清楚,现在从其中摘出两个容器,用例题对它们的用法进行进一步解释. 以下是例题的介 ...
- [GeekBand] STL 仿函数入门详解
本文参考文献::GeekBand课堂内容,授课老师:张文杰 :C++ Primer 11 中文版(第五版) page 37 :网络资料: 叶卡同学的部落格 http://www.leavesite. ...
- C++ STL 优先队列 (priority_queue)
std::priority_queue <queue> 优先队列 优先队列是一种容器适配器,根据某些严格的弱排序标准,使其第一个元素始终包含的最大元素. 这种特性类似于堆,它可以在 ...
- C++ STL之vector详解
转自http://blog.sina.com.cn/s/blog_9f1c0931010180cy.html Vectors vector是C++标准模板库中的部分内容,它是一个多功能的,能够操作 ...
随机推荐
- MySQL5.5安装(Windows版本)
1. 官网下载mysql5.5 下载地址:http://dev.mysql.com/downloads/mysql/5.5.html#downloads 2. 安装mysql5.5(安装之前,请关闭杀 ...
- PHpStorm + phpstudy 断点调试配置
步骤: phpstudy 其他菜单 ->打开配置文件 ->打开 php.ini ->找到 XDebug ->XDebug修改成下面文字 [XDebug] :红色 (1 ...
- 一图看懂hadoop Spark On Yarn工作原理
hadoop Spark On Yarn工作原理
- ubuntu软件安装
介绍常用的ubuntu软件及其安装 首先声明,本人在以下的操作全部基于腾讯云16.04版本ubuntu,若版本不一,有些出入,遇到问题可以在楼下留言. ubuntu中文官网 汉化终端 下载中文包 su ...
- java虚拟机内存管理
1. java虚拟机内存如下 2. 运行时数据区 内存图分析:
- OpenStack部署博客推荐
OpenStack部署推荐博客 shhnwangjian https://www.cnblogs.com/shhnwangjian/category/942049.html(推荐) 点评: 1.实现过 ...
- Git 创建并管理局域网仓库
Git 作为当前比较流行的代码管理工具,可以实现多人协作,不同版本代码管理. 本文内容基于Ubuntu. 0. 配置git信息 git config --global user.name XXX # ...
- 20155207第二周myod以及课堂测试
第二周myod以及课堂测试 第二周测试5 题目 1.除了main.c外,其他4个模块(add.c sub.c mul.c div.c)的源代码不想给别人,如何制作一个mymath.so共享库?main ...
- python 生成随机长度的字符串
import os def randomString(n): return (''.join(map(lambda xx:(hex(ord(xx))[2:]),os.urandom(n))))[0:1 ...
- 成都Uber优步司机奖励政策(4月10日)
滴快车单单2.5倍,注册地址:http://www.udache.com/ 如何注册Uber司机(全国版最新最详细注册流程)/月入2万/不用抢单:http://www.cnblogs.com/mfry ...