带有lambda比较器的c++ priority_queue错误

C++ priority_queue with lambda comparator error

本文关键字:queue 错误 priority c++ lambda 比较器 带有      更新时间:2023-10-16

我有以下错误的代码,我试图在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);