如何为 std::priority_queue 的比较器编写带捕获的 lambda
How to write lambda with captures for the comparator of std::priority_queue
我有以下代码片段,我想在其中创建一个 lambda 表达式,但要捕获 std::priority_queue:
vector<vector<int>> arrays;
......
// I'd like to create a lambda comparator which will access the element of arrays
auto cmp = [&arrays](const pair<size_t, size_t> &a, const pair<size_t, size_t> &b) -> bool
{
return arrays[a.first][a.second] >= arrays[b.first][b.second];
};
// Then, I'd like to put this lambda to be used in the priority queue.
std::priority_queue<pair<size_t, size_t>, vector<pair<size_t, size_t>>, decltype(cmp)> queue;
但是,我会得到以下编译错误,因为 Clang 想在构造 cmp 时插入一个参数:
'value_compare' 的初始化没有匹配的构造函数
候选构造函数(隐式复制构造函数)不可行:需要 1 个参数,但提供了 0 个
对此有什么建议吗?谢谢
你必须在构造它时将 decltype(cmp)
(比如,cmp
)的实例传递给队列。
lambda 的类型不存储捕获的数组。该状态在 lambda 的值中,因此必须按值传递。
我有以下代码片段,我想在其中创建一个 lambda 表达式,但要捕获 std::priority_queue:
vector<vector<int>> arrays;
......
// I'd like to create a lambda comparator which will access the element of arrays
auto cmp = [&arrays](const pair<size_t, size_t> &a, const pair<size_t, size_t> &b) -> bool
{
return arrays[a.first][a.second] >= arrays[b.first][b.second];
};
// Then, I'd like to put this lambda to be used in the priority queue.
std::priority_queue<pair<size_t, size_t>, vector<pair<size_t, size_t>>, decltype(cmp)> queue;
但是,我会得到以下编译错误,因为 Clang 想在构造 cmp 时插入一个参数:
'value_compare' 的初始化没有匹配的构造函数 候选构造函数(隐式复制构造函数)不可行:需要 1 个参数,但提供了 0 个
对此有什么建议吗?谢谢
你必须在构造它时将 decltype(cmp)
(比如,cmp
)的实例传递给队列。
lambda 的类型不存储捕获的数组。该状态在 lambda 的值中,因此必须按值传递。