admin管理员组文章数量:1623798
说到优先队列,大家肯定想到了队列(这肯定是对于学过队列的同学来说,当然了,没学过也没事,对于本篇文章没什么问题滴),队列的特征是后进后出,按照排队先来后到的顺序的,本篇文章介绍的priority_queue优先队列是按照优先级的顺序来排队,优先级我们可以把它理解成是一种规则,不像队列那样抽象的说是按照时间的,优先队列的这种规则我们可以自己自定义,接下来我们来看看具体的讲解。
目录
一、关于priority_queue使用到的的函数
二、priority_queue的定义
三、具体举例
(1)普通例子:
(2)pair类型 比较(先比较第一个,如果第一个想等的话再比较第二个)
(3)自定义排序
一、关于priority_queue使用到的的函数
size() 优先队列中的元素个数 empty() 判断优先队列中的元素是否为空 top() 优先队列中的队首元素,也就是优先级最高的元素 push() 插入元素到队尾,并且按照优先级排好序 pop() 删除容器中的第一个元素
二、priority_queue的定义
priority_queue<type,container,functional>
type:就是类型,如int,double等等。
container:容器类型的意思,必须是用数组实现的容器,比如说有vector,deque等,但不能用list链表,STL默认的是vector,如果没有理解的话,我们就把这段介绍简化为以后要用vector就行啦,基本上都是它。
functional:就是比较的方式,也就是自定义的规则。
当我们想要自定义规则,才需要传入这三个参数,平时一般不需要的。
如priority_queue<int>是从大到小排的,就是降序(大顶堆,有些资料又说是小顶堆,我都搞糊涂了,哈哈哈)
三、具体举例
(1)普通例子:
//priority_queue<int>降序排列,从大到小
//priority_queue<int,vector<int>,less<int> >降序排列
//priority_queue<int,vector<int>,greater<int> >升序排列,从小到大
#include<bits/stdc++.h>
using namespace std;
int n;
priority_queue<int>a;//初始是从大到小排序
int main()
{
cin>>n;
int x;
for(int i=0;i<n;i++){
cin>>x;
a.push(x);
}
while(!a.empty()){
cout<<a.top()<<" ";
a.pop();
}
return 0;
}
(2)pair类型 比较(先比较第一个,如果第一个想等的话再比较第二个)
#include<bits/stdc++.h>
using namespace std;
priority_queue<pair<int,int> >a;//从大到小,降序排列
int main()
{
pair<int,int>b(11,2);
pair<int,int>c(1,23);
pair<int,int>d(234,3);
pair<int,int>e(78,888);
a.push(b);
a.push(c);
a.push(d);
a.push(e);
while(!a.empty()){
cout<<a.top().first<<" "<<a.top().second;
cout<<endl;
a.pop();
}
return 0;
}
(3)自定义排序
struct rule{
bool operator()(node a,node b){
return a.y<b.y;
}
};这个叫做运算符重载,顾名思义,就是自己修改规则,rule是自定义的规则名称,自己选择,其他的大家可以当成死记硬背的知识,return 后面的语句就是自己指定的规则,上面的规则是按照结构体中成员变量y从大到小来排序的
#include<bits/stdc++.h>
using namespace std;
typedef struct{
int x;
int y;
}node;
struct rule{ //按照结构体中y从大到大
bool operator()(node a,node b){
return a.y<b.y;
}
};
int main()
{
int n;
cin>>n;
priority_queue<int,vector<node>,rule>a;
for(int i=0;i<n;i++){
node q;
cin>>q.x>>q.y;
a.push(q);
}
cout<<"优先级级:-----------"<<endl;
while(!a.empty()){
cout<<a.top().x<<" "<<a.top().y;
cout<<endl;
a.pop();
}
return 0;
}
好啦,本篇文章结束啦,想要学会priority_queue我还推荐大家去洛谷上面找相关题目去练习滴,加油哈!!!
本文标签: 队列使用方法priorityqueue
版权声明:本文标题:priority_queue优先队列的使用方法 内容由热心网友自发贡献,该文观点仅代表作者本人, 转载请联系作者并注明出处:https://www.elefans.com/dianzi/1728895158a1178317.html, 本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌抄袭侵权/违法违规的内容,一经查实,本站将立刻删除。
发表评论