priority_queue(优先队列),重载运算符

本文详细介绍了C++中的priority_queue(优先队列)的使用,包括基本函数如push、top、pop等,以及如何用于合并果子问题和重载运算符实现特定问题的解决方案,如求解最小消耗体力和最小和问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一.priority_queue(优先队列)

1.头文件及定义

#include<iostream>
#include<queue>
using namespace std;
int main(){
	priority_queue<int> q;//递增优先队列
	priority_queue<int,vector<int>,greater<int> > q1;//递减优先队列 
	return 0;
} 

2.基本函数使用

#include<iostream>
#include<queue>
using namespace std;
priority_queue<int> q;//递增优先队列
priority_queue<int,vector<int>,greater<int> > q1;//递减优先队列 
int main(){
	q.push(x);//把x放入队列
	q.top();//取出队头元素,但不删除 
	q.pop();//删除队头元素 
	q.size();//返回q的长度
	q.empty();//判断队伍是否为空,空返回1 
	return 0;
} 

3.优先队列使用举例

合并果子:共有n堆果子,要把他们合并成一堆。没合并两堆果子消耗两个果子数量之和的体力,现要求最少消耗的体力。

思路:每次取最少的两堆果子,将其合并后,把合并的果子再放到数组中,直到只剩一堆果子。

代码如下:

#include<iostream>
#include<queue>
using namespace std;
priority_queue<int,vector<int>,greater<int> > q;
int n,x;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>x;
		q.push(x);
	}
	int sum=0;
	while(q.size()>1){
		x=q.top();
		q.pop();
		x+=q.top();
		q.pop();
		sum+=x;
		q.push(x);
	} 
	cout<<sum;
	return 0;
} 

二.重载运算符的使用

1.定义方法(两种方法都可)

#include<iostream>
#include<queue>
using namespace std;
struct node{
	int x,y,sum;
	bool operator<(const node&a)const {return sum>a.sum; }
	friend bool operator<(node a,node b) {return a.sum>b.sum; }
};
int main(){
	return 0;
} 

2.在优先队列中的用法

#include<iostream>
#include<queue>
using namespace std;
struct node{
	int x,y,sum;
	friend bool operator<(node a,node b) {return a.sum>b.sum; }
};
priority_queue<node> q; 
int main(){
	q.push({x,y,z});//放入优先队列
	q.top().x,q.top().y,q.top().sum;//取出队首元素的各部分
	q.pop();//删除一个元素
	q.size();//返回q的长度
	q.empty();//判断队伍是否为空,空返回1  
	return 0;
} 

3.重载运算符的使用演示

题目:给两个长度为n序列,使其中任意两个数相加,求结果最小的n个数。

思路:给序列从小到大排序,前面的数一定大于后面的。

代码如下:

#include<iostream>
#include<algorithm>
#include<map>
#include<queue>
using namespace std;	
const int N=100005;
struct node{
	int x,y,sum;
	node(int _x,int _y,int _sum) {x=_x,y=_y,sum=_sum; } 
	friend bool operator<(node a,node b) {return a.sum>b.sum; }
};
priority_queue<node> q;
int n,a[N],b[N];
map<pair<int,int>,int> mp;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=n;i++){
		cin>>b[i];
	}
	sort(a+1,a+1+n);
	sort(b+1,b+1+n);
	q.push({1,1,a[1]+b[1]});
	while(n--){
		int x=q.top().x,y=q.top().y;
		cout<<q.top().sum<<" ";
		q.pop();
		mp[{x,y}]=1;
		if(!mp[{x+1,y}]){
			q.push({x+1,y,a[x+1]+b[y]});
		}
		if(!mp[{x,y+1}]){
			q.push({x,y+1,a[x]+b[y+1]});
		}
	}
	return 0;
}

### C++ 中 `priority_queue` 和自定义比较器 在 C++ 的标准模板库(STL)中,`std::priority_queue` 是一种容器适配器,默认情况下它是一个最大堆。为了改变其行为并实现最小堆或其他排序逻辑,可以提供一个自定义的比较函数。 #### 自定义优先级队列 当创建 `std::priority_queue` 时,可以通过传递第三个参数来指定不同的比较方式: ```cpp #include <queue> #include <functional> struct Compare { bool operator()(const int& lhs, const int& rhs) const { return lhs > rhs; } }; std::priority_queue<int, std::vector<int>, Compare> minHeap; // 或者使用 lambda 表达式作为比较器 auto cmp = [](int a, int b){return a > b;}; std::priority_queue<int, std::vector<int>, decltype(cmp)> customPQ(cmp); ``` 上述代码展示了如何通过结构体或 Lambda 函数来自定义比较操作[^1]。 #### 排序算法中的重载函数 对于内置类型的数组或向量可以直接调用 `std::sort()` 进行升序排列;如果想要降序或者其他特定顺序,则需传入额外的谓词表达式给该函数: ```cpp #include<algorithm> #include<vector> bool compare(int a, int b){ return a>b; // 实现降序排序 } std::vector<int> vec={7,2,5,3}; std::sort(vec.begin(),vec.end(),compare); // 使用lambda简化写法 std::sort(vec.begin(), vec.end(), [](int a,int b)->bool{return a<b;} ); ``` 此部分说明了如何利用外部布尔返回值型的二元运算符来进行定制化排序[^4]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值