优先队列的常见用法
priority_queue可以解决一些贪心问题,也可以对Dijkstra算法进行优化。

优先队列的底层是用堆来实现的。

在任何时候可以往优先队列里面加入push元素,而优先队列底层的
数据结构堆heap会随时调整结构,使得每次的队首元素都是优先级最大的。

和queue不一样的是,优先队列没有front()函数和back()函数,我们只能通过top()函数来访问队首元素。(也可以称为堆顶元素)

而其中的pop()函数和push()函数,也是针对队首元素进行操作的。

那么,priority_queue内元素的优先级如何进行设置呢?
这个是重点:

基本数据类型的优先级设置
首先需要知道,priority_queue的两种定义方式:

priority_queue<int> q1;
priority_queue<int,vector<int>,less<int>   > q2;

以上两种定义方式是相同的。
重点关注第二种定义方式:关注多出来的两个参数:
一个是 vector ,另一个是 less

其中第二种定义方式的第二个参数,填写的是来承载底层数据结构堆heap的容器,如果第一个参数是double类型,就填写vector ;而第三个参数less 则是对第一个参数的比较类,less 表示数字大的优先级越大,而greater表示数字小的优先级越大。

因此,如果想让优先队列总是把最小的元素放在队首,只需进行如下定义:

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

上面的是对基本数据类型进行优先级的设定及处理。

那么,如何对于自定义的数据类型进行优先级的设定及处理呢?

总结,其实和sort()函数的应用有相似之处,但是,优先队列的这个函数与sort()函数的cmp()函数的效果是相反的。

1.对“<”进行重载,但是与sort()下重载的效果相反,切记;
2.同样的,可以自己编写cmp()函数,但是此处cmp()的内部实现其实是对“()”进行了重载,而且还需要用struct将其包装起来,但是内部实现逻辑就和sort()里面的比较逻辑相同了

如下:


struct fruit{

    string name;
    int price;

}f1,f2;


struct cmp{

    bool operator () (fruit f1,fruit f2)
    {
        return f1.price>f2.price;
    }

};