【问题标题】:Using Lambdas in Maps在地图中使用 Lambda
【发布时间】:2012-01-05 02:49:20
【问题描述】:

我正在尝试在 C++11 中使用 lambda 函数实现映射

std::map<int, int, [](const int&a, const int& b) { return a < b; }> test;

但是失败了

错误:‘template&lt;class _Key, class _Tp, class _Compare, class _Alloc&gt; class std::map’ 模板参数列表中参数 3 的类型/值不匹配

错误:期望一个类型,得到‘{}’

错误:‘;’ 令牌之前的声明类型无效

有什么建议吗?

【问题讨论】:

标签: c++ c++11 lambda


【解决方案1】:

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

auto mycomp = [](const int&a, const int& b) { return a < b; };
std::map<int, int, decltype(mycomp)> test(mycomp);

虽然事实上,由于您的 lambda 没有捕获,它实际上可以存储在函数指针中,所以您也可以这样做:

std::map<int, int, bool(*)(const int&,const int&)>
    test([](const int&a, const int& b) { return a < b; });

虽然我发现第一个更具可读性。虽然使用函数指针类型更加通用。即它可以接受与该签名匹配的任何函数指针或非捕获 lambda。但是,如果您将 lambda 更改为正在捕获,它将无法正常工作。对于更通用的版本,您可以使用std::function,即:

std::map<int, int, std::function<bool(const int&, const int&)>>

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

【讨论】:

  • 请注意,如果声明了 2 个地图,它们将有 2 种不同的类型并且不兼容。
  • @Jesse:这将是在 lambda 上使用函数指针类型而不是 decltype 的一个参数,就像我在第二个示例中所做的那样。但更好的(为了兼容性,而不是效率)是使用std::function,然后它甚至可以与捕获的lambdas和其他函数对象兼容。
  • 请注意,由于类型擦除,std::function&lt;&gt; 方法将比函数指针方法产生更多开销。
  • ... 和 bool (*)(…) 原始函数指针版本可能会比 decltype 版本产生间接函数调用开销,这可能是最快的。
猜你喜欢
  • 2015-09-18
  • 2014-11-09
  • 2021-04-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-12-28
相关资源
最近更新 更多