Lambda表达式的概念
所谓lambda就是表示一个可调用的代码单元 ,也可以说是一个可调用对象,还可以理解为一个没有命名的内联函数(匿名函数 )。 Lambda拥有一个返回类型 ,一个形参列表 ,一个函数体 。也可以定义在函数内部。
[ capture] ( parameters) mutable -> return - type{ statement}
[capture]:捕捉列表。捕捉列表总是出现在Lambda函数的开始处 。实际上,[]是Lambda引出符。编译器根据该引出符判断 接下来的代码是否是Lambda函数 。捕捉列表能够捕捉上下文中的变量以供Lambda函数使用;
1.[var] 表示值传递 方式捕捉变量var ; 2.[=] 表示值传递 方式捕捉所有父作用域的变量 (包括this); 3.[&var] 表示引用传递 捕捉变量var ; 4.[&] 表示引用传递方式 捕捉所有父作用域的变量 (包括this); 5.[this] 表示值传递 方式捕捉当前的this指针 。 (parameters):参数列表。 mutable: mutable修饰符。默认情况下,Lambda函数总是一个const函数 ,mutable可以取消其常量性 。在使用该修饰符时,参数列表不可省略(即使参数为空); ->return-type:返回类型。用追踪返回类型形式声明函数的返回类型。我们可以在不需要返回值的时候也可以连同符号”->”一起省略。此外,在返回类型明确 的情况下,也可以省略 该部分,让编译器 对返回类型进行推导 ;
# include <iostream>
# include <algorithm>
using namespace std;
int main ( )
{
int num[ 4 ] = { 4 , 2 , 3 , 1 } ;
sort ( num, num+ 4 , [ = ] ( int x, int y) -> bool { return x < y; } ) ;
for ( int n : num) {
cout << n << " " ;
}
return 0 ;
}
Lambda表达式的优点
声明式编程风格 :就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或函数对象 。以更直接的方式撰写程序代码,具有较高的可读性和可维护性 。简洁 :不需要额外写一个函数或函数对象,避免了代码膨胀和功能分散;在需要的时间和地点实现功能闭包,使程序更灵活;