有关priority_queue+lambda的坑
之前写东西容器(deque,vector,map,set..)或者容器适配器(priority_queue ,stack,queue)直接拿过去用。对于本身有序的,想要更改其排序顺序,习惯写函数对象去更改。
不过在写题的时候,比如148,23。我都用到了priority_queue,他默认是top返回最大的元素,我想改成top返回最小的,不过没有写仿函数,而是直接在后面写了lambda,然后出问题了。我是按照写sort/for_each等等那些算法的方式去写的lambda
但正确写法如下:
我取148的部分示例:
auto cmp=[](ListNode*a,ListNode*b){return a->val>b->val;};priority_queue<ListNode*,vector<ListNode*>,decltype(cmp)> que(cmp);
仿函数的话就得这么写
class Solution
{bool operator()(ListNode *a,ListNode*b)const{return a->val>b->val;}}; priority_queue<ListNode*,vector<ListNode*>,Solution> que;
为啥要这么写呢?其实在学习的时候有学到,但是自己没有注意区分,好久没写就忘了。我后面查了一下,在这记录一下。
首先清楚lambda表达式,他是一个匿名函数,是一个对象。就是一个operator()方法,而不是一个类
对于priority_queue第三个参数要传入的是一个类,而对于sort呀这一类的算法函数,带自定义第三个参数的,人家源码传的是一个对象
这就是为什么priority_queue默认的是
priority_queue<T,vector<T>,less<T>> pp;
而算法函数默认的是
sort(x.begin(),x.end(),less<>()); 默认的
看到这个括号的区别了吧 !
map和set(底层红黑树)要想在创建时更改排序顺序同priority_queue(底层堆),第三个参数传的是类,用lambda的时候也是类似的,要么就写个仿函数把类名传进去。
引入我之前写map的一句话:
需要注意的是,map是在定义时指定的,所以传参的时候直接传入函数对象的类名,就像指定key和value时指定的类型名一样;sort算法是在调用时指定的,需要传入一个对象,当然这个也简单,类名()就会调用构造函数生成对象。
c++优先队列priority_queue(自定义比较函数) 建议阅读--