为什么用lambda表达式?
c++标准库中的大多算法(尤其是排序算法)能接受一个叫做谓词的参数以便我们能够提供自己定义的操作来代替默认运算符,但是标准库算法所使用的谓词只有两类:一元谓词(它们只接受单一参数)和二元谓词(它们有两个参数),根据算法接受一元谓词还是二元谓词,我们传递给算法的谓词必须严格接受一个或两个参数。但是,有时我们希望进行的操作需要有更多参数,超出了算法对谓词的限制。为了解决此问题,就需要使用lambda表达式
什么是lambda表达式?
lambda表达式是c++中四种可调用对象之一(任意一个能够对其使用调用运算符的对象或者表达式),一个lambda表达式表示一个可调用的代码单元,可以将其理解为一个未命名的内联函数,但与函数不同,lambda表达式可能定义在函数内部。
lambda表达式形式:
[capture list] (parameter list) -> return type {function body}
//capture list(捕获列表)是一个lambda所在函数中定义的局部变量
//的列表,parameter list, return type, function body 分别表示
//参数列表,返回类型,函数体。lambda必须使用尾置返回。
我们可以忽略参数列表和返回类型(忽略返回类型时,lambda根据函数体中的代码推断返回类型,如果函数体只是一个return语句,则返回类型从返回的表达式的类型推断而来,否则,返回类型为void),但必须永远包含捕获列表和函数体,例如:
auto f = [] {return 42;} ;
//我们定义了一个可调用对象f,它不接受参数
//lambda的调用方式与普通函数的调用方式相同,都是使用调用运算符
cout << f() << endl; //打印42
需要注意的是:如果lambda的函数体包含任何单一return语句之外的内容,且未指定返回类型,则返回void
怎么正确使用lambda表达式?
<1>向lambda传递参数
与普通函数调用类似,调用一个lambda时给定的实参被用来初始化lambda的形参。通常,实参和形参的类型必须匹配。与普通函数不同,lambda不能有默认参数。
列举一个算法调用lambda表达式的例子:
vector<string> words{"acsjfb", "sejfgie", "efuhwuidjj"};
stable_sort(words.begin(), words.end(),
[](const string &a, const string &b)
{ return a.size() < b,size();});
//stable_sort会调用给定的这个lambda表达式比较两个元素