首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >在地图中使用Lambdas

在地图中使用Lambdas
EN

Stack Overflow用户
提问于 2012-01-05 10:49:20
回答 1查看 24.3K关注 0票数 29

我正在尝试在C++11中实现一个带有lambda函数的映射

代码语言:javascript
复制
std::map<int, int, [](const int&a, const int& b) { return a < b; }> test;

但这失败了,因为

错误:‘template<class _Key, class _Tp, class _Compare, class _Alloc> class std::map’的模板参数列表中参数%3处的类型/值不匹配

错误:应为类型,但已获取‘{}’

错误:‘;’标记前的声明中的类型无效

有什么建议吗?

EN

回答 1

Stack Overflow用户

发布于 2012-01-05 11:11:23

您需要将lambda的类型作为模板参数传递,而不是lambda本身。你想要的是:

代码语言:javascript
复制
auto mycomp = [](const int&a, const int& b) { return a < b; };
std::map<int, int, decltype(mycomp)> test(mycomp);

尽管实际上,因为您的lambda没有捕获,它实际上可以存储在一个函数指针中,所以您也可以这样做:

代码语言:javascript
复制
std::map<int, int, bool(*)(const int&,const int&)>
    test([](const int&a, const int& b) { return a < b; });

尽管我发现第一个更易读。尽管使用函数指针类型更加通用。即,它可以接受与该签名匹配的任何函数指针或非捕获λ。但是,如果您将lambda更改为捕获,它将不起作用。对于更多功能的版本,您可以使用std::function,即:

代码语言:javascript
复制
std::map<int, int, std::function<bool(const int&, const int&)>>

这将适用于任何函数,lambda(捕获与否)或函数对象,只要签名匹配即可。

票数 42
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/8736997

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档