【转】优先队列priority_queue 用法详解
http://www.cnblogs.com/void/archive/2012/02/01/2335224.html
优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序
每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储。
例如:我们常用的操作就是对数据排序,优先队列默认的是数据大的优先级高
所以我们无论按照什么顺序push一堆数,最终在队列里总是top出最大的元素。
用法:
示例:将元素5,3,2,4,6依次push到优先队列中,print其输出。
1. 标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
priority_queue<int> pq;
通过<操作符可知在整数中元素大的优先级高。
故示例1中输出结果为: 6 5 4 3 2
2. 数据越小,优先级越高
priority_queue<int, vector<int>, greater<int> >pq;
其中
第二个参数为容器类型。
第二个参数为比较函数。
故示例2中输出结果为:2 3 4 5 6
3. 自定义优先级,重载比较符号
重载默认的 < 符号

struct node
{
friend bool operator< (node n1, node n2)
{
return n1.priority < n2.priority;
}
int priority;
int value;
};

这时,需要为每个元素自定义一个优先级。
注:重载>号会编译出错,因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。
而且自定义类型的<操作符与>操作符并无直接联系
代码:

1 #include<iostream>
2 #include<functional>
3 #include<queue>
4 using Namespace stdnamespace std;
5 struct node
6 {
7 friend bool operator< (node n1, node n2)
8 {
9 return n1.priority < n2.priority;
10 }
11 int priority;
12 int value;
13 };
14 int main()
15 {
16 const int len = 5;
17 int i;
18 int a[len] = {3,5,9,6,2};
19 //示例1
20 priority_queue<int> qi;
21 for(i = 0; i < len; i++)
22 qi.push(a[i]);
23 for(i = 0; i < len; i++)
24 {
25 cout<<qi.top()<<" ";
26 qi.pop();
27 }
28 cout<<endl;
29 //示例2
30 priority_queue<int, vector<int>, greater<int> >qi2;
31 for(i = 0; i < len; i++)
32 qi2.push(a[i]);
33 for(i = 0; i < len; i++)
34 {
35 cout<<qi2.top()<<" ";
36 qi2.pop();
37 }
38 cout<<endl;
39 //示例3
40 priority_queue<node> qn;
41 node b[len];
42 b[0].priority = 6; b[0].value = 1;
43 b[1].priority = 9; b[1].value = 5;
44 b[2].priority = 2; b[2].value = 3;
45 b[3].priority = 8; b[3].value = 2;
46 b[4].priority = 1; b[4].value = 4;
47
48 for(i = 0; i < len; i++)
49 qn.push(b[i]);
50 cout<<"优先级"<<'\t'<<"值"<<endl;
51 for(i = 0; i < len; i++)
52 {
53 cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;
54 qn.pop();
55 }
56 return 0;
57 }

【转】优先队列priority_queue 用法详解的更多相关文章
- [转]c++优先队列(priority_queue)用法详解
既然是队列那么先要包含头文件#include <queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队 优先队列具有队列的所有特性, ...
- c++优先队列(priority_queue)用法详解
转自csdn的文章,仅作为学习笔记.原文链接:https://blog.csdn.net/weixin_36888577/article/details/79937886 普通的队列是一种先进先出的数 ...
- STL priority_queue 常见用法详解
<算法笔记>学习笔记 priority_queue 常见用法详解 //priority_queue又称优先队列,其底层时用堆来实现的. //在优先队列中,队首元素一定是当前队列中优先级最高 ...
- C#中string.format用法详解
C#中string.format用法详解 本文实例总结了C#中string.format用法.分享给大家供大家参考.具体分析如下: String.Format 方法的几种定义: String.Form ...
- @RequestMapping 用法详解之地址映射
@RequestMapping 用法详解之地址映射 引言: 前段时间项目中用到了RESTful模式来开发程序,但是当用POST.PUT模式提交数据时,发现服务器端接受不到提交的数据(服务器端参数绑定没 ...
- linux管道命令grep命令参数及用法详解---附使用案例|grep
功能说明:查找文件里符合条件的字符串. 语 法:grep [-abcEFGhHilLnqrsvVwxy][-A<显示列数>][-B<显示列数>][-C<显示列数>] ...
- mysql中event的用法详解
一.基本概念mysql5.1版本开始引进event概念.event既“时间触发器”,与triggers的事件触发不同,event类似与linux crontab计划任务,用于时间触发.通过单独或调用存 ...
- CSS中伪类及伪元素用法详解
CSS中伪类及伪元素用法详解 伪类的分类及作用: 注:该表引自W3School教程 伪元素的分类及作用: 接下来让博主通过一些生动的实例(之前的作业或小作品)来说明几种常用伪类的用法和效果,其他的 ...
- c++中vector的用法详解
c++中vector的用法详解 vector(向量): C++中的一种数据结构,确切的说是一个类.它相当于一个动态的数组,当程序员无法知道自己需要的数组的规模多大时,用其来解决问题可以达到最大节约空间 ...
随机推荐
- 【2017 Multi-University Training Contest - Team 6】Inversion
[链接]h在这里写链接 [题意] 给出一个序列,求2~n每一个数,下标不是这个数倍数的最大值是什么? [题解] 把a数组从大到小排序. 每个位置i,逆序枚举b数组,找到第一个对应下标不是i的倍数的,直 ...
- 设计模式六大原则(一):单一职责原则(Single Responsibility Principle)
单一职责(SRP)定义: 不要存在多于一个导致类变更的原因,通俗的说,即一个类只负责一项职责. 问题由来: 类T负责两个不同的职责:职责P1,职责P2.当由于职责P1需求发生改变而需要修改类T时,有可 ...
- 洛谷——P1823 音乐会的等待
https://www.luogu.org/problem/show?pid=1823 题目描述 N个人正在排队进入一个音乐会.人们等得很无聊,于是他们开始转来转去,想在队伍里寻找自己的熟人.队列中任 ...
- Weblogic问题汇总
1. weblogic unable to get file lock问题 在项目使用过程中,非正常结束Weblogic进程导致Weblogic无法启动,出现以下错误: <BEA-141281& ...
- spring扫描自定义注解并进行操作
转载:http://blog.csdn.net/cuixuefeng1112/article/details/45331233 /** * 扫描注解添加服务到缓存以供判断时候为对外开放service ...
- Maven在dos窗口中的命令
转自:https://www.cnblogs.com/zyjava/p/4310957.html 1.配置环境变量 MAVEN_HOME : D:\apache-maven-3.0.2 MAVEN : ...
- 这一篇sigmoid和softmax的比较,讲的不错
文章: http://blog.csdn.net/u014422406/article/details/52805924 sigmoid函数(也叫逻辑斯谛函数): 引用wiki百科的定义: A lo ...
- [Angular] The Select DOM Event and Enabling Text Copy
When we "Tab" into a input field, we want to select all the content, if we start typing, i ...
- 参数传递方法(用Delphi的汇编代码解释)
参数传递方法 李纬的InsideVCL<第一章>中提到Windows定义的回调函数 typedef LRESULT (CALLBACK*WNDPROC)(HWND,UNIT,WPARAM, ...
- Mac 环境下svn服务器的配置
Mac 环境下svn服务器的配置 本文目录 • 一.创建代码仓库,用来存储客户端所上传的代码 • 二.配置svn的用户权限 • 三.使用svn客户端功能 在Windows环境中,我们一般使用Torto ...