前言
之前从没用过优先队列,刷算法题目的时候才开始了解的,所以做个总结。什么情况下使用呢?比如当你需要获取到最大最小值元素,而又不想用最大最小堆的原生实现,STL提供给你更加简单的库,就是priority_queue,其时间复杂度也只有o(nlogn)。
说明
根据元素的优先级被读取,这个优先级取决于你设置的排序函数,如果你没设置,缺省的排序法则则是利用operator<形成降序排列,也就是从大到小排列的大顶堆,第一个自然就是最大的元素。还有如果你没设置保存数据的容器Container的话,默认用的是vector。
namespace std{
template <class T,
class Container = vector<T>,
class Compare = less<typename Container:: value_type >>
class priority_queue ;
}
priority_queue提供了三个基本函数,分别是:
top()
push()
pop()
注意,pop并不会返回元素,top才会返回堆顶的元素。
STL提供了仿函数greater<>,less<>,简化了自己再定义排序函数的过程。如果你想使用自己定义的结构,而不想使用基本数据类型,也是ok的,不过你需要在你自定义的类中重载运算符,比如:
class Student{
int id;
char name[20];
bool gender;
bool operator < (Student &a) const{
return id > a.id;
}
};
priority_queue<int, vector<int>, less<int>> maxHeap;//存储小的值,值越大,优先级越高
priority_queue<int,vector<int>, greater<int>> minHeap;//存储大的值,值越小,优先级越高