priority_queue优先队列的使用方法

说到优先队列,大家肯定想到了队列(这肯定是对于学过队列的同学来说,当然了,没学过也没事,对于本篇文章没什么问题滴),队列的特征是后进后出,按照排队先来后到的顺序的,本篇文章介绍的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我还推荐大家去洛谷上面找相关题目去练习滴,加油哈!!!

  • 13
    点赞
  • 57
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
priority_queueC++标准库中的一个容器适配器,它基于堆结构实现了一个优先级队列。默认情况下,priority_queue使用std::less作为比较规则,即元素按照从大到小的顺序排列。如果你想修改比较规则,可以通过自定义比较函数或者重载元素的比较运算符来实现。 方法一:自定义比较函数 你可以定义一个自定义的比较函数,该函数接受两个参数,并返回一个bool值,表示两个参数的比较结果。比如,如果你想要按照从小到大的顺序排列元素,可以定义一个比较函数如下: ```cpp bool compare(int a, int b) { return a > b; } ``` 然后在创建priority_queue对象时,将该比较函数作为第二个参数传入: ```cpp priority_queue<int, vector<int>, decltype(compare)*> pq(compare); ``` 方法二:重载元素的比较运算符 如果元素是自定义的类对象,你可以重载该类的比较运算符来修改比较规则。比如,如果你想要按照自定义类对象的某个成员变量从小到大的顺序排列,可以在类中重载小于号运算符(<): ```cpp class MyObject { public: int value; // 其他成员变量和函数 bool operator<(const MyObject& other) const { return value < other.value; } }; ``` 然后在创建priority_queue对象时,指定元素类型为MyObject即可: ```cpp priority_queue<MyObject> pq; ``` 这样,priority_queue会根据MyObject类中重载的小于号运算符来进行比较和排序。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

菜到极致就是渣

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值