如何使用std :: priority_queue的比较器捕获lambda

时间:2018-04-22 23:16:12

标签: c++ 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

对此有何建议?感谢。

1 个答案:

答案 0 :(得分:2)

构建它时,您必须将decltype(cmp)(例如cmp)的实例传递给队列。

lambda的类型不存储被捕获的数组。该状态是lambda的值,因此必须通过值传递。