C++ Lambda表达式
Lambda表达式创建匿名函数对象,优势是不需要重新定义一个函数,只需要在函数指针的参数入口处写Lambda表达式,好处是简洁,增加代码的可读性,不需要重新定义函数
Lambda表达式包括捕获列表,参数列表,函数选项,返回值类型,函数体组成,其中捕获列表可以捕获当前可用的变量,有两种捕获方式,一种是引用捕获,一种是值捕获,函数列表用于传入函数参数,函数选项可以是mutable,当以值的类型捕获当前可用的变量时,默认是const传递,值不可被改变,使用mutable可以改变这一特性,返回值类型可以手动指定,也可以使用自定义类型推导
通过引用的方式捕获变量
int a = 2;
int b = 3;
auto f = [&a]()->int{return a+=1;};
cout << f() << endl;
通过值的方式捕获变量,要改变值必须引入函数选项mutable
int a = 2;
int b = 3;
auto f = [a]()mutable->int{return a+=1;};
cout << f() << endl;
下面的代码运行结果如下
int a = 2;
int b = 3;
auto f = [a]()mutable->int{return a+=1;};
cout << f() << endl;
cout << a << endl;
说明在lambda表达式内部有一个同名的变量a将main函数中的变量a覆盖
vector<int> v{1,2,3};
for_each(v.begin(),v.end(),[](int value){cout << value << endl;});
在Lambada表达式中,第一个表示当前代码段作用域传入的参数,第二个参数表示使用的参数,第三个参数表示函数的具体实现。
Lambada表达式可以直接使用当前可使用的变量,比如
int a =3;
for_each(v.begin(),v.end(),[a](int value){cout << value << endl;});
还可以使用引用,从而对变量的值进行修改
int a =3;
for_each(v.begin(),v.end(),[a](int value){cout << value << endl;
a = 4;});
还可以直接使用“ = ”表示传入当前所有可用变量的copy
“ & ”表示传入当前所有可用变量的引用
int a =3;
for_each(v.begin(),v.end(),[=](int value){cout << value << endl;});
int a =3;
for_each(v.begin(),v.end(),[&](int value){cout << value << endl;
a = 4;});