> 文章列表 > 有关priority_queue+lambda的坑

有关priority_queue+lambda的坑

有关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(自定义比较函数) 建议阅读--