STL 之 优先队列(1)

优先队列用法

在优先队列中,优先级高的元素先出队列。

标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

优先队列的第一种用法:

也是最常用的用法

priority_queue<int> qi;

通过<操作符可知在整数中元素大的优先级高。

故示例1中输出结果为:9 6 5 3 2

第二种用法:

在示例1中,如果我们要把元素从小到大输出怎么办呢?

这时我们可以传入一个比较函数,使用functional.h函数对象作为比较函数。

priority_queue<int, vector<int>, greater<int> >qi2; //从小到大的优先级队列

可将greater改为less即为从大到小

其中 第一个参数为容器类型。 第二个参数为比较函数。

故示例2中输出结果为:2 3 5 6 9

第三种用法: 自定义优先级。

struct node

{

   friend bool operator< (node n1, node n2)

{

   return n1.priority < n2.priority; //"<"为从大到小排列">"为从小打到排列

}

int priority;

int value;

};

在该结构中,value为值,priority为优先级。

通过自定义operator<操作符来比较元素中的优先级。

在示例3中输出结果为:

优先级  值

9          5

8          2

6          1

2          3

1          4

但如果结构定义如下:

struct node

{

   friend bool operator> (node n1, node n2)

{

return n1.priority > n2.priority;

}

int priority;

int value;

};

则会编译不过(G++编译器)

因为标准库默认使用元素类型的<操作符来确定它们之间的优先级关系。

而且自定义类型的<操作符与>操作符并无直接联系,故会编译不过。

//代码清单

 1 #include<iostream>
 2 #include<functional>
 3 #include<queue>
 4 using namespace 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 }

时间: 2024-08-01 08:16:24

STL 之 优先队列(1)的相关文章

【STL】优先队列priority_queue详解+OpenJudge-4980拯救行动

一.关于优先队列 队列(queue)这种东西广大OIer应该都不陌生,或者说,队列都不会你还学个卵啊(╯‵□′)╯︵┻━┻咳咳,通俗讲,队列是一种只允许从前端(队头)删除元素.从后端(队尾)插入元素的数据结构.而优先队列(priority queue)是一种赋予每个队列中元素以一个优先级的队列.在执行删除操作时,优先队列会删除具有最高优先级的元素.如此奇妙的优先队列有什么用呢,举个例子,给定一个长为n的序列和m组询问,对于每组询问,我们要找出删去序列中最小的数,再向序列加入一个数.朴素的想法是对

STL中优先队列的使用

普通的队列是一种先进先出的数据结构,元素在队列尾追加,而从队列头删除.在优先队列中,元素被赋予优先级.当访问元素时,具有最高优先级的元素最先删除.优先队列具有最高级先出的行为特征.我们来说一下C++的STL queue库中优先队列的使用方法.STL默认使用<操作符来确定对象之间的优先级关系,所以如果要使用自定义对象,需要重载<操作符.优先队列有两种,一种是最大优先队列:一种是最小优先队列:每次取自队列的第一个元素分别是优先级最大和优先级最小的元素. 使用头文件queue. 优先队列的操作: q

STL 之 优先队列(priority_queue)

1.什么是优先队列 能够完成下列两种操作的数据结构,我们便称之为优先队列. ①插入一个数值    ②取出最大(或者最小)的数值(获取数值,并且删除). 从严格意义上来说优先队列,并不是队列,因为它并不遵循队列的FIFO(先进先出的原则). 2.实现优先队列 我们可以使用一种叫做"堆(heap)"的数据结构来实现优先队列.堆有一个重要的性质就是儿子的值一定不小于父亲.除此之外,树的节点是从上到下.从左到右的顺序紧凑排列的.堆就是如下图的二叉树, 不知道是什么是二叉树的同学请移步:传送门

STL库---优先队列

题目描述 Description 在一个果园里,多多已经将所有的果子打了下来,而且按果子的不同种类分成了不同的堆.多多决定把所有的果子合成一堆. 每一次合并,多多可以把两堆果子合并到一起,消耗的体力等于两堆果子的重量之和.可以看出,所有的果子经过n-1次合并之后,就只剩下一堆了.多多在合并果子时总共消耗的体力等于每次合并所耗体力之和. 因为还要花大力气把这些果子搬回家,所以多多在合并果子时要尽可能地节省体力.假定每个果子重量都为1,并且已知果子的种类数和每种果子的数目,你的任务是设计出合并的次序

STL priority_queue 优先队列 小记

今天做题发现一个很有趣的地方,竟然还是头一次发现,唉,还是太菜了. 做图论用STL里的priority_queue去优化prim,由于特殊需求,我需要记录生成树中是用的哪些边. 于是,我定义的优先队列类型的数据结构如下: 1 struct node //优先队列存储结构,v存储节点号,e存储边号,dis[]为到该点的最短距离 2 { 3 int v,e; 4 node(){} 5 node(int _v,int _e):v(_v),e(_e){} 6 bool operator <(const

V - stl 的 优先队列 Ⅱ

Description Because of the wrong status of the bicycle, Sempr begin to walk east to west every morning and walk back every evening. Walking may cause a little tired, so Sempr always play some games this time.         There are many stones on the road

STL中优先队列的使用 转

队列的特点是先进先出.通常都把队列比喻成排队买东西,大家都很守秩序,先排队的人就先买东西.但是优先队列有所不同,它不遵循先进先出的规则,而是根据队列中元素的优先权,优先权最大的先被取出.通常把优先队列比喻成现实生活中的打印.一个打印店里有很多打印机,每台机器的性能不一样,有的打印机打印很快,有的打印机打印速度很慢.当这些打印机陆陆续续打印完自己的任务时进入排队等候状态.如果我这个时候要打印一份文件,我选的不是第一个排队的打印机,而是性能最好,打印最快的打印机. 重点:优先级队列,是要看优先级的,

STL之优先队列

priority_queue 优先级队列是一个拥有权值概念的单向队列queue,在这个队列中,所有元素是按优先级排列的(也可以认为queue是个按进入队列的先后做为优先级的优先级队列--先进入队列的元素优先权要高于后进入队列的元素).在计算机操作系统中,优先级队列的使用是相当频繁的,进线程调度都会用到.在STL的具体实现中,priority_queue也是以别的容器作为底部结构,再根据堆的处理规则来调整元素之间的位置. priority_queue函数列表 函数 描述 构造析构 priority

(转)C++STL中优先队列的使用

原文地址 说到队列,我们首先想到就是先进先出,后进后出:那么何为优先队列呢,在优先队列中,元素被赋予优先级,当访问元素时,具有最高级优先级的元素先被访问.即优先队列具有最高级先出的行为特征. 优先队列在头文件#include <queue>中: 其声明格式为:priority_queue <int> ans;//声明一个名为ans的整形的优先队列 基本操作有: empty( )  //判断一个队列是否为空 pop( )  //删除队顶元素 push( )  //加入一个元素 siz

STL - priority_queue(优先队列)

参考:http://www.cnblogs.com/xzxl/p/7266404.html 一.基本定义: 优先队列容器与队列一样,只能从队尾插入元素,从队首删除元素.但是它有一个特性,就是队列中最大的元素总是位于队首,所以出队时,并非按照先进先出的原则进行,而是将当前队列中最大的元素出队.这点类似于给队列里的元素进行了由大到小的顺序排序.元素的比较规则默认按元素值由大到小排序,可以重载"<"操作符来重新定义比较规则. 优先级队列可以用向量(vector)或双向队列(deque)