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

优先队列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

3.我们可以自己定义比较器,这个比较神奇,我只知道大概写法,比较器是个类;重载的是”()“,在优先队列中默认为"<",

1 class mycmp{
2     public :
3         bool operator() (比较的元素类型  a1,比较的元素类型 a2)
4         {
5             return   比较的方法; 
6         }
7 };

这里注意重载的是(),就是小于号,得到的重载完后,que.top()是队尾的元素;

posted on 2020-04-18 17:27  很绝望  阅读(883)  评论(0编辑  收藏  举报