c ++:struct和decltype比较器的priority_queue

时间:2019-12-08 01:28:22

标签: c++ lambda priority-queue decltype

class Solution {

    struct tree{
        int x;
        int y;
        int height;
    }; 



public:
    int cutOffTree(vector<vector<int>>& forest) {

         auto lambda1 =  [](tree &t1, tree &t2){return t1.height < t2.height;};

         priority_queue<tree, vector<tree>, decltype(lambda1)> pq1;

        return 0;
    }
};

但出现错误:

enter image description here

知道我做错了什么吗?谢谢!

1 个答案:

答案 0 :(得分:4)

priority_queue需要一个Compare类型的实例用于比较。

priority_queue的默认构造函数尝试将实例构造为Compare()。由于Compare是一种关闭类型,由于关闭类型无法默认构造,因此它将失败。

您需要将实例提供给构造函数。它将保存一份副本供以后使用:

priority_queue<tree, vector<tree>, decltype(lambda1)> pq1{lambda1};

就目前而言,在C ++ 20中,对于没有捕获的lambda(例如此处),这将不再是必需的,因为它们将被默认构造。您可以使用例如在编译器中的实验性C ++ 20支持来进行尝试。 -std=c++2a/std:c++latest标志添加到您的编译器。


自C ++ 17起,您还可以使用类模板参数推导来避免两次命名lambda和值类型:

priority_queue pq1{lambda1, vector<tree>};