目录
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();
}
}
输出结果将由小到大。