如何为 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 的值中,因此必须按值传递。