应该将多少参数传递给C ++ Lambda?

时间:2019-01-21 18:16:18

标签: c++ c++11 lambda

我真的是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; 
    });

此处仅将1个参数传递给lamda函数。以及i的值是什么以及它从何处传递到lamda

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

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

将这两个值传递给lamda的地方,请解释一下,请清除我的疑问

1 个答案:

答案 0 :(得分:1)

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

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

一元谓词p的要求是:

  

p-一元谓词,它为必需元素返回``true''。

     

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

这意味着类型UnaryPredicate必须提供类似于(在您的情况下)的呼叫操作员:

bool operator()(int const&) const;

lambda只是带有重载的call-operator的闭包类型的实例,其返回值和参数类型是从lambda推导出的。声明:

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

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

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

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