priority_queue(优先队列)容器介绍

1.

优先队列是在正常队列的基础上加了优先级,保证每次的队首元素都是优先级最大的。
每次操作队列中的元素都是按优先级排序的。
(你可以用它来排序,但是sort一般就可以排序,他的用处一般是在每次对序列进行增 删 改 的操作时,优先队列还能按优先级排序)
(比如一个优先队列 6 4 2 1 0 加入一个值5,优先队列就是6 5 4 2 1 0)

它的底层是通过堆来实现的。

//头文件
#include<queue>
//初始化定义
priority_queue<int>pq;

代码 含义
top() 访问队首元素
push() 入队
pop() 堆顶(队首)元素出队
size() 队列元素个数
empty()
注意没有clear()! 不提供该方法
优先队列只能通过top()访问队首元素(优先级最高的元素)

3.

(1) 基本数据类型的优先级

priority_queue<int, vector<int>, less<int> >pq;
//最后两个>之间要有空格

解释:

第二个参数:
vector< int > 是用来承载底层数据结构堆的容器,若优先队列中存放的是double型数据,就要填vector< double >
总之存的是什么类型的数据,就相应的填写对应类型。

第三个参数:
less< int > 表示数字大的优先级大,堆顶为最大的数字
greater< int >表示数字小的优先级大,堆顶为最小的数字
int代表的是数据类型,也要填对应的类型
自定义排序:

struct cmp1
{
	bool operator()(int x,int y)
	{
		return x>y;//小的优先级高 ,从小到大排 
	}
}; 
struct cmp2
{
	bool operator()(const int x,const int y)
	{
		return a[x]>a[y];
	}
}; 
priority_queue<int,vector<int>,cmp1>pq1;
priority_queue<int,vector<int>,cmp2>pq2;

(2)结构体(或自定义)优先级设置
优先级设置可以定义在结构体内进行小于号重载,也可以定义在结构体外,下面演示定义在外面的简单写法,详情大家可以搜索相关博客进行了解。

//要排序的结构体(存储在优先队列里面的)
struct node
{
	int x,y;
};

版本一:

//定义的比较结构体
//注意:cmp是个结构体 
struct cmp
{//自定义堆的排序规则 
	bool operator()(const node& a,const node& b)
	{
		return a.x>b.x;//从堆底到堆顶 降序排序 
	}//如果要升序改变不等号方向就好
};

//初始化定义, 
priority_queue<node,vector<node>,cmp >pq; 

版本二:不用写关的参数,直接在node里面写
因为是在node里面自定义的规则,所以是node里面的值自动排了,并不需要cmp结构体了

struct node
{
	int x,y;
	friend bool operator<(node a,node b)
	{//为两个结构体参数,结构体调用一定要写上friend
		return a.x>b.x;//按x从小到大排 
	}
};

或者:

struct node
{
    bool operator < (const node& a) const
    {//直接传入一个参数,不必要写friend
        return x > a.x;//优先级大的为x小的值,升序排列
    }
};

优先队列的定义

priority_queue<node>pq4;

注意: 优先对列自定义排序规则和sort()函数定义cmp函数很相似,但是最后返回的情况是相反的。即相同的符号,最后定义的排列顺序是完全相反的。
所以只需要记住sort的排序规则和优先队列的排序规则是相反的就可以了

(1)存储pair类型
排序规则:
默认先对pair的first进行降序排序,然后再对second降序排序
对first先排序,大的排在前面,如果first元素相同,再对second元素排序,保持大的在前面

#include<bits/stdc++.h>
using namespace std;
int main()
{
    priority_queue<pair<int,int> >q;
	q.push({7,8});
	q.push({7,9});
	q.push(make_pair(8,7));
    while(!q.empty())
    {
        cout<<q.top().first<<" "<<q.top().second<<endl;
        q.pop();
    }
    return 0;
}
结果:
8 7
7 9
7 8
posted @   飘向远方丶  阅读(61)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 如何调用 DeepSeek 的自然语言处理 API 接口并集成到在线客服系统
· 【译】Visual Studio 中新的强大生产力特性
· 2025年我用 Compose 写了一个 Todo App
点击右上角即可分享
微信分享提示