【问题标题】:How Many Parameters Should Be Passed to C++ Lambda?应该向 C++ Lambda 传递多少参数?
【发布时间】:2019-01-21 18:16:18
【问题描述】:

我对 c++11 真的很陌生,所以在理解 lamda 表达式的同时,我充满了疑问。我无法理解应该将多少参数传递给 lamda 表达式。

喜欢

vector<int> v {4, 1, 3, 5, 2, 3, 1, 7};
vector<int>:: iterator p = find_if(v.begin(), v.end(), [](int i) 
    { 
        return i > 4; 
    });

这里只有一个参数被传递给lamda 函数。 i 的值是什么,它从哪里传递给lamda

但在以下情况下,传递了 2 个参数

sort(v.begin(), v.end(), [](const int& a, const int& b) -> bool
    { 
        return a > b; 
    });

这两个值是从哪里传给lamda的,请解释一下,请解开我的疑惑

【问题讨论】:

  • 每个需要谓词或函数对象的算法都会根据具体情况指定对它的要求。您可以在 cppreference 上查找它。这是std::sorten.cppreference.com/w/cpp/algorithm/sort
  • 给-1评分是什么意思,我说我是新手,我做了很多研究仍然没有得到令人信服的答案所以来到这里,如果给-ve就没有回答评分那么我怎样才能得到正确的答案

标签: c++ c++11 lambda


【解决方案1】:

需要一个或多个谓词的标准库的每个算法对给定的谓词都有特定的要求。如果你看std::find_if

template< class InputIt, class UnaryPredicate >
InputIt find_if( InputIt first, InputIt last, UnaryPredicate p );

一元谓词p的要求是:

p — 一元谓词,为所需元素返回真。

表达式p(v) 必须可转换为bool 类型的每个参数v(可能是constVT,其中VTInputIt 的值类型,与值类别无关,并且不得修改v。 [...]

这意味着UnaryPredicate 类型必须提供类似于(在您的情况下)的调用运算符:

bool operator()(int const&) const;

lambda 只是一个闭包类型的实例,它具有一个重载的调用运算符,其返回和参数类型是从 lambda 推导出来的。本声明:

auto lambda = [](int i) { return i > 4; };

...类似于以下使用匿名类型:

struct {
    bool operator()(int i) const { retuirn i > 4; }
} lambda;

如您所见,这种匿名类型的operator() 对于std::find_if 的要求是有效的,这就是这里可以使用lambda 的原因。

【讨论】:

  • 感谢您的解释,但有一个疑问,谁将提供 i 的值,它如何获取值,以防运算符重载我们用值调用它
  • @TuhinPanda 和简单的函数一样,参数的值由调用函数的人给出。在我的示例中,我会使用lambda(3) 来调用带有i = 3 的lambda。在您的情况下,是 std::find_ifstd::sort 调用 lambda。您可以检查std::find_if(第二版)的possible implementation,您会看到谓词p(在您的情况下是lambda)在if (p(*first))中被调用。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-03-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多