学习了一个关于Lambda表达式的视频,感觉明白了许多,现将学习笔记整理如下,分享C++初学者:
一、Lambda表达式定义:字面意思就是没有名字的函数(故称匿名函数),可以很方便的让我们定义函数。并把函数当做参数给别的函数调用。Lambda表达式的优点是代码简洁。
首先举一个例子:
vector <int > v { 0,2,5,3,14,6 }; // 实例化一个vector容器v并赋初值
auto f= [] (int a,int b){return a<b; }; // auto--由编译器自行判断函数返回类型
sort ( v.begin(), v.end(), f ); //利用Lambda表达式匿名函数 f 中的升序规则对 v 中的值排序
运行结果:v中的数据被按升序排序。
二、Lambda表达式的基本语法形式:
[ OuterVar ]( int x,int y ) -> int { return OuterVar+x+y; }
[ ] -- 捕获变量列表,可以为空(表示不捕获变量)
( ) -- 参数列表
->int -- 返回类型,可以忽略,由编译器自行判定,忽略时 -> 也不用写。
{ } -- 函数主体,由于lambda表达式一般是作为函数的参数使用,大多都有返回值。
再举例:
auto f= [](int a,int b)->int{return a+b;}
cout<<f(1,2)<<endl;
输出结果:3
三、变量捕获(Capture Clause):
[ ]内不为空时可以捕获函数体外边的变量,举例:
int N=100,M=10;
auto g = [ N, &M ]( int i ) { M = 20; return N*i; }
cout << g (10) << endl; // 输出结果:1000
cout<<M<<endl; // 输出结果:20
[N,&M]含义--N按值捕获:在Lambda式内不能修改 N的值;&M按引用捕获,按引用捕获可以在Lambda表达式内修改变量的值。
如果 [ ] 中只写 [ & ] 表示按引用方式捕获所有封闭范围内的变量;
如果 [ ] 中只写 [ = ] 表示按值方式捕获所有封闭范围内的变量;封闭范围:指在同一{ }中的变量,但包含全局变量。
[&,N] 含义为除变量N按照值捕获,其他变量按引用捕获,也可[=,&N],意思相反。