优先队列是个很方便的东西,然而很多时候本人自己一直搞不清他是大顶堆还是小顶堆,后来在学习中终于明白了;
优先队列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 };
3.我们可以自己定义比较器,这个比较神奇,我只知道大概写法,比较器是个类;重载的是”()“,在优先队列中默认为"<",
1 class mycmp{ 2 public : 3 bool operator() (比较的元素类型 a1,比较的元素类型 a2) 4 { 5 return 比较的方法; 6 } 7 };
这里注意重载的是(),就是小于号,得到的重载完后,que.top()是队尾的元素;