c++优先队列(最大堆)的基本用法以及排序用法(cmp)

本文介绍了C++标准库中的优先队列(priority_queue),它是一种基于堆实现的数据结构,允许自定义数据的优先级。通过示例展示了如何创建升序和降序的优先队列,并解释了如何使用自定义比较函数对pair进行排序。优先队列在算法题中常作为辅助工具,提供高效排序功能。
摘要由CSDN通过智能技术生成

c++的queue中有一种优先队列 他会自动按要求递增或者递减排序
在写一些算法题的时候可以起到很好的辅助作用
今天给大家简单介绍一下这些

优先队列

既然是队列那么先要包含头文件#include ,
他和queue不同的就在于我们可以自定义其中数据的优先级, 让优先级高的排在队列前面,优先出队

优先队列也具有普通队列的所有的特性 比如size等等 其本质是用堆实现的 所以又称为最大(小)堆

定义

priority_queue<Type,Container,Functional>
其中:
Type是数据类型
Container是容器类型(Container必须是用数组实现的容器,比如vector等默认为vector
Functional就是比较的方式,也是我们后边实现排序的重要角色

当我们不声明任何的时候,默认是大顶堆

priority_queue<int, vector<int>, greater<int>> q;//升序
	priority_queue<int, vector<int>, less<int>> q;//降序
	//greater和less是std中实现的两个仿函数

例子

int main() {

	//auto cmp = [&](const auto& a, const auto& b) {
	//	return a.first + a.second < b.first + b.second;
	//};
	priority_queue<int, vector<int>, greater<int>> q1;//升序
	priority_queue<int, vector<int>, less<int>> q2;//降序
	//greater和less是std中实现的两个仿函数
	vector<int> nums = { 3,5,9,1,6,7,4 };
	for (int i = 0; i < nums.size(); i++) {
		q1.push(nums[i]);
		q2.push(nums[i]);
	}
	while (!q1.empty()) {
		cout << q1.top() << " ";
		q1.pop();
	}
	cout << endl;
	while (!q2.empty()) {
		cout << q2.top() << " ";
		q2.pop();
	}
	return 0;
}

我们可以观察一下运行结果
在这里插入图片描述
可见最大最小的排序对于字母上边没有给出例子 但是升序降序和数字是一样的

对于pair的排序

auto cmp = [&](const auto& a, const auto& b) {
		return a.first  < b.first ;
		//first+second之和小的在后大的在前
	};
	vector < pair<int, int>> pairs;
	for (int i = 0; i < 5; i++) {
		pair<int, int> a;
		a.first = i + 1;
		a.second = 5 - i;
		pairs.push_back(a);
	}
	cout << "排序前:" << endl;
	for (auto pair:pairs) {
		cout << pair.first << " " << pair.second << "  |  ";
	}
	priority_queue < pair<int, int>, vector<pair<int, int>>, decltype(cmp)> PairQueue(cmp);
	//decltype是自动识别类型
	for (auto pair : pairs) {
		PairQueue.push(pair);
	}
	cout << endl;
	cout << "排序后:" << endl;
	while (!PairQueue.empty()) {
		auto pair = PairQueue.top();
		cout << pair.first << " " << pair.second << "  |  ";
		PairQueue.pop();
	}
	return 0;

在这里插入图片描述
我们可以通过这种方式对于pair中任何想要的想要的结果设计cmp

这就是我所介绍的全部内容 希望对大家有帮助

  • 5
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值