1、头文件
#include<queue>
2、模板
STL源码中,包含三个模板参数:类型、容器适配器、比较规则。
template <class T, class Container = vector<T>,
class Compare = less<typename Container::value_type> >
class priority_queue;
- 参数1: 优先级队列的元素类型 T ,例如问题里第一个例子,元素类型 T 是 std::pair<int,int> ,后面两个例子,元素类型 T 是 int
- 参数2: 优先级队列内部具体用那种容器(Container) 存储参数1指定的元素类型,例如问题里的 vector< pair<int,int> > 和 vector<int>。实际上,第2个模板参数是有默认类型参数的,默认类型参数是 vector<T> ,T 取决于参数1指定的类型是什么。
- 参数3: 参数3需要指定一个实现了 operator< 操作符的类(叫做仿函数或者函数对象,实际上就是类,只是调用时写起来像函数一样),比较操作符的实现符合 严格弱顺序 strict weak order 语义,请参考资料3。模板参数3也是有默认类型,默认是 std::less<typename Container::value_type> ,其中 Container 指的是参数2,Container::value_type 指的是参数2类内部的声明的其元素值的类型。
3、常见类型
class T为常见类型:数字、字符串(string)
priority_queue<int> pq; //默认为最大堆,默认容器vector<int>
4、非基本类型(重写仿函数)
//less 建大堆,重载 <
template<class T>
struct Less
{
bool operator()(const T& left,const T& right)
{
return left < right;
}
};
//greater 建小堆,重载 >
template<class T>
struct Greater
{
bool operator()(const T& left, const T& right)
{
return left > right;
}
};
priority_queue<T,vector<T>,Less> pq; //最大堆
priority_queue<T,vector<T>,Greater> pq; //最小堆
4、常用函数
q.size();//返回q里元素个数
q.empty();//返回q是否为空,空则返回1,否则返回0
q.push(k);//在q的末尾插入k
q.pop();//删掉q的第一个元素
q.top();//返回q的第一个元素