c++ - 优先队列 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 比较器,外部有另一个比较器。为什么只有第一个优先级队列可以编译而第二个不能编译并给出无效声明函数类型的错误。先感谢您。
解决方案
cmp
是一个 lambda。它是一个带有()
运算符的对象。
而是cmp2()
一个函数。
您不能将函数用作可调用类型,但可以将函数指针用作可调用类型,在这种情况下,您必须使用decltype(&cmp)
来获取函数指针类型:
priority_queue<array<int, 2>, vector<array<int, 2>>, decltype(&cmp2)> pq2(&cmp2);
推荐阅读
- android - 在排序方法中跳过单个项目
- swagger - npm WARN deprecated swagger-ui@2.2.10: 不再维护,请升级到 swagger-ui@3
- uvm - 如何使用 uvm_printer 而不是默认的十六进制格式以十进制格式打印整数值
- php - 为什么我的 Guzzle 6 get() 调用返回一个空流?
- java - Deorg.apache.xerces.parsers.XIncludeAwareParserConfiguration 不能转换为 org.apache.xerces.xni.parser.XMLParserConfiguration
- php - API 平台:更改端点的描述
- sql - Oracle SQL:使用 SUM OVER PARTITION 更新表
- docker - 在具有自动启动功能的单个节点上运行 docker stack & swarm?
- python - 使用 django-ipware get_client_ip 而不是 get_real_ip
- powershell - 从 powershell 运行 veracrypt