C++优先队列——priority_queue

priority_queue

常规用法

priority_queue底层是用堆来实现的,因此可以把它看成一个堆。默认是值大的优先级高。

#include <iostream>
#include <queue>
using namespace std;

int main(){
	priority_queue<int> q;
	q.push(4);
	q.push(8);
	q.push(2);
	cout << q.top() <<  endl;
	return 0;
}
输出结果为 8

我们可以改变优先级,要在优先队列的定义中添加参数:

priority_queue<int, vector<int>, greater<int>> q;
q.push(4);
q.push(8);
q.push(2);
cout << q.top() <<  endl;
输出结果为 2

priority_queue<int, vector<int>, greater<int>> q第一个参数表示队列的数据类型,第二个参数表示承载底层数据结构“堆”的容器,第三个参数greater<int>表示数字小的优先级高,若是less<int>则表示数字大的优先级高。

结构体用法

如果队列中的数据类型是复杂的结构体,那么需要进行运算符重载。

#include <iostream>
#include <queue>
using namespace std;

struct fruit {
	string name;
	double price;
	friend bool operator < (fruit a, fruit b) {	//友元函数
		return a.price > b.price;
	}
};
int main() {
	priority_queue<fruit>q;
	for (int i = 0; i < 5; i++) {
		fruit tmp;
		cin >> tmp.name >> tmp.price;
		q.push(tmp);
	}
	cout << q.top().name << ": " << q.top().price << endl;
	return 0;
}
输入:
	苹果 3.54
	鸭梨 4.53
	樱桃 9.78
	猕猴桃 7.69
	香蕉 2.35
输出结果为:香蕉 2.34

代码中的友元函数用来重载运算符<,相当于告诉优先队列,你以为的大值就是price的小值。所以优先队列按price从小到大排列。
在结构体中重载了运算符,优先队列的定义中就不需要第二个、第三个参数。
也可以把友元函数从结构体中拿出来,此时需要在优先队列的定义中添加第二个、第三个参数:

#include <iostream>
#include <queue>
using namespace std;

struct fruit {
	string name;
	double price;
};
struct cmp {	//单独拿出来运算符重载的部分
	bool operator () (const fruit& a, const fruit& b) {	//为了避免结构体中数据庞大,最好使用引用来提高效率,需要加上const和&
		return a.price > b.price;
	}
};
int main() {
	priority_queue<fruit, vector<fruit>, cmp>q;
	for (int i = 0; i < 5; i++) {
		fruit tmp;
		cin >> tmp.name >> tmp.price;
		q.push(tmp);
	}
	cout << q.top().name << ": " << q.top().price << endl;
	return 0;
}
输入:
	苹果 3.54
	鸭梨 4.53
	樱桃 9.78
	猕猴桃 7.69
	香蕉 2.35
输出结果为:香蕉 2.34
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值