STL 优先队列
STL 中栈的使用方法(stack)
#include <stack>
基本操作:
push(x) 将x加入栈中,即入栈操作
pop() 出栈操作(删除栈顶),只是出栈,没有返回值
top() 返回第一个元素(栈顶元素)
size() 返回栈中的元素个数
empty() 当栈为空时,返回 true
基本操作:
push(x) 将x压入队列的末端
pop() 弹出队列的第一个元素(队顶元素),注意此函数并不返回任何值
front() 返回第一个元素(队顶元素)
back() 返回最后被压入的元素(队尾元素)
empty() 当队列为空时,返回true
size() 返回队列的长度
---------- 栈和队列的用法都相对简单,下面详细介绍优先队列的用法 -----------
STL 中优先队列的使用详细介绍(priority_queu)
#include <queue>
基本操作:
empty() 如果队列为空返回真
pop() 删除对列首元素
push() 加入一个元素
size() 返回优先队列中拥有的元素个数
top() 返回优先队列首元素
在默认的优先队列中,优先级高的先出队。
标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系。
(1)优先队列的第一种用法,这是最常用的默认的优先级用法,也就是优先级高的先出队列,例如说一个int优先队列,那么出队的时候就是int大的先出队列。
下面给出一个例子:
- #include <iostream>
- #include <queue>
- using namespace std;
- int main()
- {
- priority_queue<int> q;
- for(int i = 1;i <= 5;i++)
- {
- q.push(i);
- }
- for(int i = 0;i < 5;i++)
- {
- cout<<q.top()<<endl;
- q.pop();
- }
- return 0;
- }
运行结果可想而知,就是从大到小的: 5 4 3 2 1
(2)那么如果想要优先队列中低优先级的元素先出队列,怎么办呢? --- 自定义优先级
①方法一:我们可以传入一个比较函数,使用functional头文件中的greater函数对象作为比较函数
注意:首先要添加头文件:#include <functional>
priority_queue< int,vector<int>,greater<int> > q; // 注意:> > 误写成>> 会报错
这样我们就创建了一个低优先级元素先出对列的优先队列。
修改上面的例子,运行,就会发现,输出的顺序变成了:1 2 3 4 5。
当然,与greater相对的less,如果传入less这个比较函数,那么就是高优先级元素先出队列了。
priority_queue< int,vector<int>,less<int> > q;
priority_queue<int> q;
以上创建的优先队列是相同的。
②方法二:自己实现比较函数
- struct cmp1
- {
- bool operator ()(int x,int y)
- {
- return x>y; //小值优先
- }
- };
priority_queue<int,vector<int>,cmp1 > q;
这样就创建了一个小值元素先出队列的优先队列,这里的 cmp1 作用就相当于 greater
同理我们可以写出:
- struct cmp2
- {
- bool operator ()(int x,int y)
- {
- return x<y; //大值优先
- }
- };
priority_queue<int,vector<int>,cmp2 > q;
这里就是创建了一个大值元素先出队列的优先队列,这里的 cmp2 作用也就是相当于 less
(3)假如优先队列中的元素是一个结构对象或者是类对象,那么如何重新自定义其优先级比较呢?
例子一:定义一个结构体,这个结构体只有一个元素 x 。
①低优先级元素先出队列,也就是x值小的先出队列。
- struct number1
- {
- int x;
- bool operator < (const number1 &a) const
- {
- return x>a.x;//小值优先
- }
- };
- number1 num1[5];
- priority_queue<number1>q;
- for(int i = 1; i <= 5; i++)
- {
- num1[i].x = i;
- q.push(num1[i]);
- }
- for(int i = 1; i <= 5; i++)
- {
- cout<<q.top().x<<endl;
- q.pop();
- }
输出: 1 2 3 4 5
②高优先级元素先出队列,也就是x值大的先出队列。
- struct number2
- {
- int x;
- bool operator < (const number2 &a) const
- {
- return x<a.x;//大值优先
- }
- };
注意到:结构体中重载的运算符只可以是 <, 因为标准库默认使用元素类型的 < 操作符来确定它们之间的优先级关系,如果重载 > ,那么会编译错误。
例子二:在上面的例子中,我们是将 结构体中的 x 的大小当做是优先级比较值了。下面给出另一例子,这个例子更具有一般性。
- struct node
- {
- friend bool operator < (node n1, node n2)
- {
- return n1.priority < n2.priority;
- }
- int priority;
- int value;
- };
在这个结构体中,priority表征优先级值。
- priority_queue<node> qn;
- node b[5];
- b[0].priority = 6; b[0].value = 1;
- b[1].priority = 9; b[1].value = 5;
- b[2].priority = 2; b[2].value = 3;
- b[3].priority = 8; b[3].value = 2;
- b[4].priority = 1; b[4].value = 4;
- for(int i = 0; i < 5; i++)
- qn.push(b[i]);
- cout<<"优先级"<<'\t'<<"值"<<endl;
- for(int i = 0; i < 5; i++)
- {
- cout<<qn.top().priority<<'\t'<<qn.top().value<<endl;
- qn.pop();
- }
输出结果为:
优先级 值
9 5
8 2
6 1
2 3
1 4
STL 优先队列的更多相关文章
- CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆)
CJOJ 2484 函数最小值 / Luogu 2085 函数最小值(STL优先队列,堆) Description 有n个函数,分别为F1,F2,...,Fn.定义 \(Fi(x)=Aix^2+Bix ...
- CJOJ 2482 【POI2000】促销活动(STL优先队列,大根堆,小根堆)
CJOJ 2482 [POI2000]促销活动(STL优先队列,大根堆,小根堆) Description 促销活动遵守以下规则: 一个消费者 -- 想参加促销活动的消费者,在账单下记下他自己所付的费用 ...
- 基于STL优先队列和邻接表的dijkstra算法
首先说下STL优先队列的局限性,那就是只提供入队.出队.取得队首元素的值的功能,而dijkstra算法的堆优化需要能够随机访问队列中某个节点(来更新源点节点的最短距离). 看似可以用vector配合m ...
- poj 3253 Fence Repair (STL优先队列)
版权声明:本文为博主原创文章,未经博主同意不得转载. vasttian https://blog.csdn.net/u012860063/article/details/34805369 转载请注明出 ...
- UVA - 136 Ugly Numbers(丑数,STL优先队列+set)
Ugly numbers are numbers whose only prime factors are 2, 3 or 5. The sequence 1, 2, 3, 4, 5, 6, 8, 9 ...
- 合并果子(STL优先队列)
STL优先队列:priority_queue 定义:priority_queue<int>q; 从小到大:priority_queue<int,vector<int>,g ...
- STL优先队列的使用
STL中有一个优先队列的容器可以使用. [头文件] queue 队列容器 vector 向量容器 [操作] 优先级队列支持的操作 q.empty() 如果队列为空,则返回true,否则 ...
- POJ 3253 Fence Repair STL 优先队列
这题做完后觉得很水,主要的想法就是逆过程思考,原题是截断,可以想成是拼装,一共有n根木棍,最后要拼成一根完整的,每两根小的拼成一根大的,拼成后的木棍长度就是费用,要求费用最少.显然的是一共会拼接n-1 ...
- STL优先队列——踩坑日记
priority_queue 可以定义STL中的优先队列,但是优先队列在应用于自己定义的类型时需要重载<运算符,或者通过仿函数来定义比较方法,在定义比较方法的过程中,比较大的坑是STL中对于参数 ...
随机推荐
- 12_CXF入门
[CXF] Apache CXF = Celtix + Xfire,开始叫 Apache CeltiXfire,后来更名为 Apache CXF 了,以下简称为 CXF.Apache CXF 是一个开 ...
- Codevs 1218 疫情控制 2012年NOIP全国联赛提高组
1218 疫情控制 2012年NOIP全国联赛提高组 时间限制: 2 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description H 国有 n 个城市,这 ...
- Visual Stuido 2015 Community 使用 GitHub 插件
微软在Visual Studio 2015产品中,深度整合了GitHub,让VS用户更方便的使用GitHub的服务. 新闻链接: Announcing the GitHub Extension for ...
- OpenJudge/Poj 2013 Symmetric Order
1.链接地址: http://bailian.openjudge.cn/practice/2013 http://poj.org/problem?id=2013 2.题目: Symmetric Ord ...
- <<深入Java虚拟机>>-第三章-垃圾收集器与内存分配策略-学习笔记
垃圾收集 垃圾收集(Garbage Collection,GC),垃圾收集需要完成的三件事情. 哪些对象需要回收 什么时候回收 如何回收 如何确定对象已死(即不可能在被任何途径引用的对象) 引用计数算 ...
- mysql数据库之索引和分析索引
分析查询语句是否用到了索引 explain sql语句\G //根据返回的信息,我们可知,该sql语句是否使用索引,从多少记录中取出,可以看到排序的方式. 主要是看 key 实际用到的索引 rows ...
- Cassandra1.2文档学习(6)—— 客户端数据请求
参考文档:http://www.datastax.com/documentation/cassandra/1.2/webhelp/index.html#cassandra/architecture/a ...
- SQL技术内幕四
数据类型: sql server只接受两种数据类型 1. 普通字符 varchar char 用一个字节表示一个字符,表示英文 2.unicode nchar nvarchar 用两个字节表示一个 ...
- 注意WPF中绑定使用的是引用类型
绑定(Binding)是WPF提供的一个非常方便的特性,它可以方便的实现一个WPF的MVVM结构. 既可以实现数据驱动UI变化,也可以做到End-user在UI上的修改实现的反映到数据上. 但是有一点 ...
- Linux下GPIO驱动(一) ----一个简单的LED驱动
/******************************* * *杂项设备驱动:miscdevice *majior=10; * * *****************************/ ...