STL之priority_queue

目录

 

1.什么是priority_queue?

2.priority_queue的原型

3.大根堆和小根堆


1.什么是priority_queue?

priority_queue本质上是一个堆,再头文件#include<queue>中,可以理解为大根堆或小根堆。

2.priority_queue的原型

priority_queue的原型为:

priority_queue<Type,Container,Functional>

其中:

Type数据类型
Container保存数据的容器,必须是用数据实现的容器,如Vector,dequed等,默认为Vector,但是不能用list
Functional为元素的比较方式,默认为operator<,同时自定义的类型要重载“<”或者">"符号

3.大根堆和小根堆

首先来看一个大根堆的实例:

# include<iostream>
using namespace std;
# include<vector>
# include<queue>
int main()
{
	//测试数据
	vector<int> arr;
	arr.push_back(1);
	arr.push_back(5);
	arr.push_back(3);
	arr.push_back(9);
	arr.push_back(7);

	priority_queue<int, vector<int>, less<int>> big_heap;
	for (auto item : arr)
	{
		big_heap.push(item);
	}
	while (!big_heap.empty())
	{
		//打印堆顶元素
		cout << big_heap.top() << "  ";
		//删除大根堆的根节点,priority_queue会对大根堆重新进行调整
		big_heap.pop();
	}

	return 0;
}

上述程序的打印结果如下,会将Vector里面的数据从大到小来进行打印。同时注意一点,大根堆传入的函数为less,小根堆传入的函数反而为greater,这一点和我们表面理解的是相反的,这主要取决于priority_queue的内部的实现方式。

最后,我们用自定义类型来存入priority_queue中,并且用小根堆来实现。

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

template<typename T>
class Value 
{
private:
	T data;
public:
	Value(T v = T()):data(v)
	{
	}
	//小根堆,我们需要重载“>”符号
	bool operator>( const Value<T>& obj)const
	{
		return data > obj.data;
	}
	T getData()
	{
		return data;
	}
};
int main()
{
	vector<Value<int>> arr;
	Value<int> a(1);
	Value<int> b(5);
	Value<int> c(3);
	Value<int> d(9);
	Value<int> e(7);
	arr.push_back(a);
	arr.push_back(b);
	arr.push_back(c);
	arr.push_back(d);
	arr.push_back(e);

	priority_queue<Value<int>, vector<Value<int>>, greater<Value<int>>> le_heap;
	for (auto item : arr)
	{
		le_heap.push(item);
	}
	while (!le_heap.empty())
	{
		Value<int> tem = le_heap.top();
		cout << tem.getData() <<"  ";
		le_heap.pop();
	}
	
	
}

输出结果将由小到大。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值