优先队列是个很方便的东西,然而很多时候本人自己一直搞不清他是大顶堆还是小顶堆,后来在学习中终于明白了;

优先队列priority_queue<,,>,实际上有三个参数,第一个代表元素类型,第二个是优先队列实现的容器类型,第三个是比较器,我们通常用的只需要输入第一个参数,后面都是默认的;

实际上完整的是 priority_queue<类型,vector<类型>,less<类型> >;less是从小到大排序,然后优先队列内部其实头指针指在最后面,所以取出来是最大的,我们我们要写小顶堆,那么只要从大到小排序,指针指在最后priority_queue<类型,vector<类型>,greater<类型> >;

下面是一些小技巧,

1.如果你依旧是大顶堆,却想要每次得到最小的,我们只要把放入的元素变成变成负数就好了;

2.或者我们的类型是个结构体,我们可以根据自定义重载小于号,变成大于;

例如下面这种:

1 struct node{
2     int u;
3     long long dis;
4     bool operator < (const node &x) const{
5         return dis>x.dis;
6     }
7 }; 
View Code

相关文章: