c++: priority_queue 结构和 decltype 比较器
c++: priority_queue of struct and decltype comparator
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;
}
};
但出现错误:
知道我做错了什么吗?谢谢!
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 开始,您还可以使用 class 模板参数推导来避免两次命名 lambda 和值类型:
priority_queue pq1{lambda1, vector<tree>};
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;
}
};
但出现错误:
知道我做错了什么吗?谢谢!
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 开始,您还可以使用 class 模板参数推导来避免两次命名 lambda 和值类型:
priority_queue pq1{lambda1, vector<tree>};