BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / cpp / #94617同步于 2017/3/1
该镜像源已超过 30 天没有更新,可能在源站已被删除。
CPP机器人发帖

请教一个优先队列自定义比较函数的问题

chenxiansf
2017/3/1镜像同步10 回复
原先想写一个优先队列,比较两个结点的值大小,像这样 priority_queue<ListNode*, vector<ListNode*>, [](ListNode* a, ListNode* b){ return a->val > b->val; }> Q; 结果发现编译不过,谷歌了一下在stackoverflow上看到这么说,lambda表达式要加decltype,并且Q要接这个lambda表达式作参数。把lambda表达式单独写就是这样 auto cmp = [](ListNode* a, ListNode* b){return a->val > b->val;}; priority_queue<ListNode*, vector<ListNode*>, decltype(cmp)> Q(cmp); 加decltype我好像理解了,但Q后面把lambda表达式作参数传入理解不了,求指点!
订阅后,新回复会通过你的通知中心匿名送达。
9 条回复
Myon机器人#1 · 2017/3/1
你不传的话它就会试图调用你给的那个类型的默认构造函数或值初始化。
nvyoujiaren机器人#2 · 2017/3/1
我很郁闷,lz能解答吗? lambda表达式又不是必要的,又难以理解,为什么要用它呢?
e97ace机器人#3 · 2017/3/1
二楼正解. 优先队列第三个模板参数是比较函数的类型,构造函数的第一个参数是比较函数类型的一个实例. ———— 主要写JavaScript. 关注广泛, 欢迎交流. 此签名通过「北邮人签名档」脚本发送
chenxiansf机器人#4 · 2017/3/1
不传的话报错,无法构造lambda实例 【 在 Myon 的大作中提到: 】 : 你不传的话它就会试图调用你给的那个类型的默认构造函数或值初始化。
chenxiansf机器人#5 · 2017/3/1
写起来比较简洁 【 在 nvyoujiaren 的大作中提到: 】 : 我很郁闷,lz能解答吗? : lambda表达式又不是必要的,又难以理解,为什么要用它呢?
chenxiansf机器人#6 · 2017/3/1
这么说好像理解了 【 在 e97ace 的大作中提到: 】 : 二楼正解. 优先队列第三个模板参数是比较函数的类型,构造函数的第一个参数是比较函数类型的一个实例. : ———— : 主要写JavaScript. 关注广泛, 欢迎交流. : ...................
solosseason机器人#7 · 2017/3/1
【 在 chenxiansf 的大作中提到: 】 : 这么说好像理解了 如果楼主觉得不方便记忆,可以这样写 struct cmp { bool operator()(const ListNode& a,const ListNode& b){return a.value > b.value;}; }; priority_queue<ListNode, vector<ListNode>,cmp> Q; 或者这样 struct ListNode { int value; ListNode* next; bool operator<(const ListNode& a) const {return value<a.value;}; }; priority_queue<ListNode, vector<ListNode>> Q;
chenxiansf机器人#8 · 2017/3/1
然后做leetcode不能修改结构体 【 在 solosseason 的大作中提到: 】 : 如果楼主觉得不方便记忆,可以这样写 : [code=c] : struct cmp : ...................
solosseason机器人#9 · 2017/3/1
【 在 chenxiansf 的大作中提到: 】 : 然后做leetcode不能修改结构体 那你就自定义一个cmp123结构体,重载()函数,这应该可以吧