首页 > 解决方案 > 优先队列 lambda 比较器和普通比较器

问题描述

#include <iostream>
#include <queue>
#include <vector>
#include <array>
using namespace std;

auto cmp2(const array<int, 2>& a, const array<int, 2>& b) {
    return a[0]+a[1] > b[0]+b[1];
}

int main() {
    auto cmp = [] (const array<int, 2>& a, const array<int, 2>& b) {
        return a[0]+a[1] > b[0]+b[1];
    };

    priority_queue<array<int, 2>, vector<array<int, 2>>, decltype(cmp)> pq(cmp);

    priority_queue<array<int, 2>, vector<array<int, 2>>, decltype(cmp2)> pq2(cmp2);
}

主函数中有一个 lambda 比较器,外部有另一个比较器。为什么只有第一个优先级队列可以编译而第二个不能编译并给出无效声明函数类型的错误。先感谢您。

标签: c++stlcomparatorpriority-queue

解决方案


cmp是一个 lambda。它是一个带有()运算符的对象。

而是cmp2()一个函数。

您不能将函数用作可调用类型,但可以将函数指针用作可调用类型,在这种情况下,您必须使用decltype(&cmp)来获取函数指针类型:

    priority_queue<array<int, 2>, vector<array<int, 2>>, decltype(&cmp2)> pq2(&cmp2);

推荐阅读