带有lambda比较器的c++ priority_queue错误
C++ priority_queue with lambda comparator error
我有以下错误的代码,我试图在VC2010中编译,但我得到错误C2974这只发生在我包含lambda表达式时,所以我猜它与此有关。
typedef pair<pair<int, int>, int> adjlist_edge;
priority_queue< adjlist_edge , vector<adjlist_edge>,
[](adjlist_edge a, adjlist_edge b) -> bool {
if(a.second > b.second){ return true; } else { return false; }
}> adjlist_pq;
我知道模板定义的形式是正确的
priority_queue<int , vector<int>, greater<int>> pq;
按预期工作。知道我哪里做错了吗?是不是有什么明显的错误,我可能忽略了?感谢阅读!
首先定义lambda对象,然后使用decltype
将其传递给模板的类型,并将其直接传递给构造函数。
auto comp = []( adjist a, adjlist b ) { return a.second > b.second; };
priority_queue< adjlist_edge , vector<adjlist_edge>, decltype( comp ) >
adjlist_pq( comp );
priority_queue
将比较器作为模板参数。Lambda函数是对象,因此不能用作模板参数(只有极少数类型可以,其中包括整型)。
你可以尝试使用decltype
:
priority_queue< adjlist_edge , vector<adjlist_edge>,
decltype( [](adjlist_edge a, adjlist_edge b) -> bool {
if(a.second > b.second){ return true; } else { return false; }
})>
adjlist_pq( [](adjlist_edge a, adjlist_edge b) -> bool {
if(a.second > b.second){ return true; } else { return false; }
} );
如果失败(和它将),您可以使用function<>
:
priority_queue< adjlist_edge , vector<adjlist_edge>,
function<bool(adjlist_edge,adjlist_edge)> >
adjlist_pq( [](adjlist_edge a, adjlist_edge b) -> bool {
if(a.second > b.second){ return true; } else { return false; }
} );
接受的答案回答了如何定义一个带有lambda表达式的priority_queue作为自定义的比较对象。我将解决问题的另一方面:为什么在以您的方式定义pq时失败:
typedef pair<pair<int, int>, int> adjlist_edge;
priority_queue< adjlist_edge , vector<adjlist_edge>,
[](adjlist_edge a, adjlist_edge b) -> bool {
if(a.second > b.second){ return true; } else { return false; }}> adjlist_pq;
为什么在构造优先级队列时必须传递lambda作为参数?原因在于lambda表达式没有默认构造函数。因此,如果在构造优先级队列时没有提供它,则将调用lambda表达式的"假定存在的默认构造函数"。显然,它会失败。
关于你的问题:这是比较对象(lambda或函数对象)是否有默认构造函数的区别。
下面是一个使用优先级队列构建最小堆的示例。我使用lambda来定义比较器,给出由vector<ListNode *> &lists
// This comparator will be used to build minheap.
auto comp = [&](ListNode *a, ListNode *b) {
return a->val > b->val;
};
// This priority queue is the min heap
priority_queue<ListNode *, vector<ListNode *>, decltype(comp)> pq(comp);
相关文章:
- 警告处理为错误这里有什么问题
- "error: no matching function for call to"构造函数错误
- boost::进程间消息队列引发错误
- C++,OpenCV,尝试显示图像时"OpenCV(4.3.0) Error: Assertion failed (size.width>0 && size.height>0)"此错误
- 有关插入适配器的错误。[错误]请求从 'back_insert_iterator<vector<>>' 类型转换为非标量类型
- QT在错误的班级中寻找空位
- vector.resize()中的分配错误
- 代码在main()中运行,但在函数中出现错误
- 释放错误后堆使用
- (C++)分析树以计算返回错误值的简单算术表达式
- Project Euler问题4的错误解决方案
- 我的字符计数代码计算错误.为什么
- 为什么我会收到"invalid conversion from 'Queue*/Stack*' to 'int'"错误消息?
- 销毁 std::queue 会导致内存错误
- 错误:在 c++ 中"too few arguements in template class name 'queue' "
- 错误:调用"Queue::Queue()"没有匹配函数
- 生成模板化的Queue类时发生链接错误
- {错误 C2338: (boost::has_trivial_destructor:<T>:value)} 对于 boost::lockfree::queue 是什么意思?我在这里错过了什
- 为什么用std::vector容器创建std::queue不会引发编译错误
- /boost/lockfree/queue.hpp:错误:静态断言失败:(boost::has_trivial_destructor<T>::value)