应该向C++Lambda传递多少个参数

How Many Parameters Should Be Passed to C++ Lambda?

本文关键字:多少 参数 C++Lambda      更新时间:2023-10-16

我对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; 
});

这里只有一个参数被传递给CCD_ 3函数。以及值i是什么以及从哪里传递到CCD_ 4。

但在下面的情况下,2个参数通过

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

这两个值从哪里传递到λ,请解释一下,请澄清我的疑虑

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

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

一元谓词p的要求是:

p—返回的一元谓词​对于所需元素为true。

对于类型为(可能是const)VT的每个参数v,表达式p(v)必须可转换为bool,其中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可以在这里使用的原因。