优先队列的常见用法
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;
}
};