C++ 优先队列priority_queue用法【转载】

priority_queue 对于基本类型的使用方法相对简单。他的模板声明带有三个参数,priority_queue<Type, Container, Functional>
Type 为数据类型, Container 为保存数据的容器,Functional 为元素比较方式。
Container 必须是用数组实现的容器,比如 vector, deque 但不能用 list.
STL里面容器默认用的是 vector. 比较方式默认用 operator< , 所以如果你把后面俩个参数 缺省的话,优先队列就是大顶堆,队头元素最大。
看例子

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 int main(){
 5     priority_queue<int,vector<int>,less<int> >q;//使用priority_queue<int> q1;一样
 6     for(int i=0;i<10;i++)
 7         q1.push(i);
 8     while(!q1.empty()){
 9         cout<<q1.top()<< endl;
10         q1.pop();
11     }
12     return 0;
13 }

如果要用到小顶堆,则一般要把模板的三个参数都带进去。
STL里面定义了一个仿函数 greater<>,对于基本类型可以用这个仿函数声明小顶堆
例子:

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 int main(){
 5     priority_queue<int,vector<int>,greater<int> >q;
 6     for(int i=0;i<10;i++)
 7         q.push(i);
 8     while(!q.empty()){
 9         cout<<q.top()<< endl;
10         q.pop();
11     }
12     return 0;
13 }

对于自定义类型,则必须自己重载 operator< 或者自己写仿函数先看看例子:

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 struct Node{
 5     int x, y;
 6 }node;
 7  bool operator<( Node a, Node b){
 8     if(a.x==b.x) return a.y>b.y;
 9     return a.x>b.x;
10 }
11  int main(){
12     priority_queue<Node>q;
13     for(int i=0;i<10;i++){
14         node.x=i;
15         node.y=10-i/2;
16         q.push(node);
17     }
18     while(!q.empty()){
19         cout<<q.top().x <<‘ ‘<<q.top().y<<endl;
20         q.pop();
21     }
22     return 0;
23 }

自定义类型重载 operator< 后,声明对象时就可以只带一个模板参数。
此时不能像基本类型这样声明priority_queue<Node, vector<Node>, greater<Node> >;
原因是 greater<Node> 没有定义,如果想用这种方法定义
则可以按如下方式

例子:(个人喜欢这种方法,因为set的自定义比较函数也可以写成这种形式)

 1 #include <iostream>
 2 #include <queue>
 3 using namespace std;
 4 struct Node{
 5     int x, y;
 6 }node;
 7 struct cmp{
 8     bool operator()(Node a,Node b){
 9         if(a.x==b.x) return a.y>b.y;
10         return a.x>b.x;}
11 };
12
13  int main(){
14     priority_queue<Node,vector<Node>,cmp>q;
15     for(int i=0;i<10;i++){
16         node.x=i;
17         node.y=10-i/2;
18         q.push(node);
19     }
20     while(!q.empty()){
21         cout<<q.top().x<<‘ ‘<<q.top().y<<endl;
22         q.pop();
23     }
24     return 0;
25 }

转载自Sup_Heaven

时间: 2024-10-08 22:32:59

C++ 优先队列priority_queue用法【转载】的相关文章

【转】优先队列priority_queue 用法详解

http://www.cnblogs.com/void/archive/2012/02/01/2335224.html 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储. 例如:我们常用的操作就是对数据排序,优先队列默认的是数据大的优先级高 所以我们无论按照什么顺序push一堆数,最终在队列里总是top出最大的元素. 用法: 示例:将元素5,3,2,4,6依次push到优

[转]c++优先队列(priority_queue)用法详解

既然是队列那么先要包含头文件#include <queue>, 他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队 优先队列具有队列的所有特性,包括基本操作,只是在这基础上添加了内部的一个排序,它本质是一个堆实现的 和队列基本操作相同: top 访问队头元素empty 队列是否为空size 返回队列内元素个数push 插入元素到队尾 (并排序)emplace 原地构造一个元素并插入队列pop 弹出队头元素swap 交换内容定义:priority_qu

优先队列基本用法

http://www.cnblogs.com/void/archive/2012/02/01/2335224.html 优先队列priority_queue 用法详解 优先队列是队列的一种,不过它可以按照自定义的一种方式(数据的优先级)来对队列中的数据进行动态的排序 每次的push和pop操作,队列都会动态的调整,以达到我们预期的方式来存储. 例如:我们常用的操作就是对数据排序,优先队列默认的是数据大的优先级高 所以我们无论按照什么顺序push一堆数,最终在队列里总是top出最大的元素. 用法:

priority_queue用法(转载)

关于priority_queue1,关于STL中的priority_queue:确定用top()查看顶部元素时,该元素是具有最高优先级的一个元素. 调用pop()删除之后,将促使下一个元素进入该位置. 2,如同stack和queue,priority_queue是一个基于基本序列容器进行构建的适配器,默认的序列器是vector. 模板原型: priority_queue<T,Sequence,Compare> T:存放容器的元素类型 Sequence:实现优先级队列的底层容器,默认是vecto

优先队列的用法

优先队列用法 在优先队列中,优先级高的元素先出队列.标准库默认使用元素类型的<操作符来确定它们之间的优先级关系.优先队列的第一种用法,也是最常用的用法: priority_queue<int> qi; 通过<操作符可知在整数中元素大的优先级高.故示例1中输出结果为:9 6 5 3 2第二种方法:在示例1中,如果我们要把元素从小到大输出怎么办呢?这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数. priority_queue<int, vector

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

从我以前的博文能看出来,我是一个队列爱好者,很多并不是一定需要用队列实现的算法我也会采用队列实现,主要是由于队列和人的直觉思维的一致性导致的. 今天讲一讲优先队列(priority_queue),实际上,它的本质就是一个heap,我从STL中扒出了它的实现代码,大家可以参考一下. 首先函数在头文件<queue>中,归属于命名空间std,使用的时候需要注意. 队列有两种常用的声明方式: std::priority_queue<T> pq; std::priority_queue<

优先队列 priority_queue 55 nyist

greater<float> 从小到大lesser<float> 总大到小 #include<queue>#include<iostream>using namespace std;int main(){ int n,m,t,x,y; long long s; priority_queue <int,vector<int>,greater<int> > my; cin>>n; while (n--) { s=0

elasticsearch的基本用法(转载)

最大的特点:  1. 数据库的 database, 就是  index  2. 数据库的 table,  就是 tag  3. 不要使用browser, 使用curl来进行客户端操作.  否则会出现 java heap ooxx... curl:  -X 后面跟 RESTful :  GET, POST ...  -d 后面跟数据. (d = data to send) 1. create: 指定 ID 来建立新记录. (貌似PUT, POST都可以)  $ curl -XPOST localh

[C/C++标准库]_[优先队列priority_queue的使用]

std::priority_queue 场景: 1. 对于一个任务队列,任务的优先级由任务的priority属性指明,这时候就需要优先级越高的先执行.而queue并没有排序功能,这时priority_queue是比较好的选择. 2 对于异步的task也是一样,在不断添加新的task时,当然希望优先级越高的先执行. 解析: 1. 如果需要把优先级最高的先pop,那么comp比较时需要返回false. 代码: //1.Elements are popped from the "back"