优先级队列 lambda 比较器和普通比较器
Priority queue lambda comparator and normal comparator
#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);
}
main函数里面有一个lambda比较器,外面还有一个比较器。为什么只有第一个优先级队列可以编译而第二个不能编译并给出无效声明函数类型的错误。
提前谢谢你。
cmp
是一个 lambda。它是一个带有 ()
运算符的对象。
但是cmp2()
是一个函数。
您不能将函数用作可调用类型,但您可以将函数 指针用作可调用类型,在这种情况下您必须使用 decltype(&cmp)
获取函数指针类型:
priority_queue<array<int, 2>, vector<array<int, 2>>, decltype(&cmp2)> pq2(&cmp2);
#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);
}
main函数里面有一个lambda比较器,外面还有一个比较器。为什么只有第一个优先级队列可以编译而第二个不能编译并给出无效声明函数类型的错误。 提前谢谢你。
cmp
是一个 lambda。它是一个带有 ()
运算符的对象。
但是cmp2()
是一个函数。
您不能将函数用作可调用类型,但您可以将函数 指针用作可调用类型,在这种情况下您必须使用 decltype(&cmp)
获取函数指针类型:
priority_queue<array<int, 2>, vector<array<int, 2>>, decltype(&cmp2)> pq2(&cmp2);