学习:STL----优先队列
优先队列是队列的高级版,最大的特点是可以内部实现排序
优先队列的定义
优先队列内部使用堆排序,从而实现队列内一直保持着某种顺序规律(比如递增,递减等)
在使用优先队列时,首先要引入头文件:#include <queue>
定义一个新类型的优先队列,通常使用:
priority_queue<[type]> [name]
type为优先队列内所存元素的数据类型,name为你定义的优先队列的名字,那么优先队列内部就会按照type类型数据从大到小排列,队列第一个元素为最大的元素。
当然,你也可以让优先队列内元素按照你想要的顺序进行排列,之后说明。
优先队列的操作
对一个优先队列,具有许多种操作,每次操作就使用[name].[操作函数]的方式进行。
优先队列有以下操作函数:
| empty() | 返回值为bool类型,判断优先队列是否为空,为空返回true,否则返回false; |
| emplace(type1 x1,...,type xn) | 这个有点复杂,后面说; |
| pop() | 返回值为void类型,删除队列第一个元素; |
| push(type x) |
返回值为void类型,向队列末尾插入一个元素,参数x的数据类型type必须和此优先队列所存数据的数据类型相同; |
| size() | 返回值一般为一个数,表示队列中当前所存元素的多少; |
| swap(priority_queue<type> x) | 返回值为void类型,交换两个队列内的元素; |
| top() | 返回值为type类型,返回队列第一个元素的值。 |
其中emplace(type1 x1,.......,typen xn)函数参数数量和类型是不确定的,只有当优先队列内部存的是结构体或者类,这个函数才有它独特的作用
emplace的参数会传到构造函数中构造一个新的对象,然后再把对象放到优先队列里,和push类似,但是push的参数只有一个,且参数数据类型必须和优先队列所存数据类型相同
例如,先创建一个结构体和优先队列:
struct op{
int a;
int b;
int c;
op(int a1,int b1,int c1){
this->a=a1;
this->b=b1;
this->c=c1;
}
bool operator<(const op &x)const{
return this->a<x.a;
}
};
priority_queue<op> que;
那么,由于结构体op的构造函数需要三个参数,所以函数emplace就应该有三个参数,例如:
que.emplace(,,);
这条语句相当于
op a(,,);
que.push(a);
或者
que.push(op(,,));
注意:编译器要支持c++11才能使用emplace函数。
自定义优先队列顺序
基本数据类型排序
在定义一个新的优先队列时
priority_queue<int> que1;
优先队列内部默认按照int类型数据由大到小排序。
还有一种由大到小的定义方式:
priority_queue<int,vector<int>,less<int> > que1;
注意:末尾的两个">"符号之间要有空格,不然会被当做">>"运算符,从而报错
如果想要队列内部按照double类型由小到大排序,只有一种定义方式:
priority_queue<double,vector<double>,greater<double> > que1;
结构体&类的排序
方法1:定义一个结构体或者类同时,还要重载一下运算符"<",只用重载"<",不要重载"="和">"(这里需要一点点c++的知识),例如:
struct op{
int a;
int b;
int c;
op(int a1,int b1,int c1){
this->a=a1;
this->b=b1;
this->c=c1;
}
bool operator<(const op &x)const{
return this->a>x.a;
}
};
记住红色部分的两个const不要忽略。
然后定义优先队列
priority_queue<op> que;
那么此优先队列中的对象,会按照成员a的值由小到大排序(此时以成员a的值为主键)
如果想要按成员b的值由大到小排序,那么重载函数应该为:
bool operator<(const op &x)const{
return this->b<x.b;
}
注意大于号和小于号的使用
方法2:重新定义一个结构体,重载"()"运算符,例如:
struct op{
int a;
int b;
int c;
op(int a1,int b1,int c1){
this->a=a1;
this->b=b1;
this->c=c1;
}
};
struct comp{
bool operator()(const op &p1,const op &p2){
return p1.a<p2.a;
}
};
然后定义优先队列
priority_queue<op,vector<op>,comp> que;
于是此优先队列里的对象也会按照成员a的值由大到小排序。
当然,如果换成">"
struct comp{
bool operator()(const op &p1,const op &p2){
return p1.a>p2.a;
}
};
对象就会按照a的值从小到大排序
学习: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 栈,队列,优先队列用法 分类: Learning C++2013-11-15 00:52 843人阅读 评论(2) 收藏 举报 c++栈队列优先队列STL STL 中栈的使用方法(stack) ...
- STL优先队列的使用
STL中有一个优先队列的容器可以使用. [头文件] queue 队列容器 vector 向量容器 [操作] 优先级队列支持的操作 q.empty() 如果队列为空,则返回true,否则 ...
- POJ 3253 Fence Repair STL 优先队列
这题做完后觉得很水,主要的想法就是逆过程思考,原题是截断,可以想成是拼装,一共有n根木棍,最后要拼成一根完整的,每两根小的拼成一根大的,拼成后的木棍长度就是费用,要求费用最少.显然的是一共会拼接n-1 ...
- C++ STL 优先队列 priority_queue 详解(转)
转自https://blog.csdn.net/c20182030/article/details/70757660,感谢大佬. 优先队列 引入 优先队列是一种特殊的队列,在学习堆排序的时候就有所了解 ...
随机推荐
- [2019杭电多校第二场][hdu6602]Longest Subarray(线段树)
题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=6602 题目大意为求最长的区间,满足C种数字在区间内要么不出现,要么出现的次数都不小于K. 大致的分析一 ...
- HDU 1880 题解(字符串哈希)
题面: 魔咒词典 Time Limit: 8000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) Total Subm ...
- java 标识接口的作用
标识接口的作用 标识接口是没有任何方法和属性的接口.标识接口不对实现它的类有任何语义上的要求,它仅仅表明实现它的类属于一个特定的类型. 标接口在Java语言中有一些很著名的应用,例如我们常用的Arra ...
- 解决本地mysql服务允许被外部主机连接
今天在网上百度看了怎么使用外部主机连接本地MySQL服务,发现大多的说法都是不全面的,试了好久,整理下: 1.现创建了一个mysql用户,并赋予常用的操作权限 CREATE USER 'mysql'@ ...
- nodejs爬虫编码问题
最近再做一个nodejs网站爬虫的项目,但是爬一些网站的数据出现了中文字符乱码的问题.查了一下,主要是因为不是所有的网站的编码格式都是utf-8,还有一些网站用的是gb2312或者gbk的编码格式.所 ...
- 移动端300ms延迟原理,穿透、遮罩层滑动导致下面滑动总结
遮罩层滑动导致下面滑动 1,阻止弹层滑动,使用默认事件,使用这种方式弹层不能滑动 document.getElementById("model").addEventListener ...
- python面向对象---用函数实现面向对象原理
类的定义:一个抽象的概念,保存一些共有的属性和特征 #对象:对象代表具体事物的特征功能,是类的实例 #面向对象程序设计 通过函数实现面向对象设计 def dog(name,type,gender): ...
- Java虚拟机——类加载机制
转自:http://blog.csdn.net/ns_code/article/details/17881581 类加载过程 类从被加载到虚拟机内存中开始,到卸载出内存为止,它的整个生命周期包括:加载 ...
- PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患(转)
PHP Session 序列化及反序列化处理器设置使用不当带来的安全隐患 时间 2014-11-14 15:05:49 WooYun知识库 原文 http://drops.wooyun.org/t ...
- bzoj3772 精神污染 dfs 序+主席树
题目传送门 https://lydsy.com/JudgeOnline/problem.php?id=3772 题解 很简单的一道题目. 上午研究一个题目的时候发现了这个题目是一个弱化版,所以来写了一 ...