优先队列这个数据结构还是很有用的,可以帮我们解决很多棘手的排序的问题,所以再来细细看一下,

priority_queue<Type, Container, Functional>

Type为数据类型, Container为保存数据的容器,Functional为元素比较方式。

如果不写后两个参数,那么容器默认用的是vector,比较方式默认用operator<,也就是优先队列是大顶堆,队头元素最大。如果想要优先输出小的元素,则要使用小顶堆

priority_queue<int, vector<int>, greater<int> > p;

这里注意,priority_queue的后两个参数是可以缺省的,但是如果要使用第三个参数,则必须使用第二个参数。

我们可以自定义第三个参数,也就是自定义优先级

(1)可以自己重载运算符<

当然这里有三种方法,类内重载,类外重载,友元函数重载,具体不再赘述。

另外,这里好像不能重载运算符>,会报错,好像是由于优先队列默认是小于封装的。

(2)自定义比较类,重载括号,operator (),由less“继承”。

struct cmpLess
{
    bool operator ()(const Node & a,const Node & b)
    {
        return a.key<b.key;
    }
};
struct cmpGreater
{
    bool operator ()(const Node & a,const Node & b)
    {
        return a.key>b.key;
    }
};
int main()
{
    priority_queue<Node,vector<Node>,cmpLess> pqLess;
    priority_queue<Node,vector<Node>,cmpGreater> pqGreater;
    .......
}
posted on 2018-08-04 23:15  Mini_Coconut  阅读(197)  评论(0编辑  收藏  举报