priority_queue

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

};

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值