lambda 表达式(又称为 lambda)就像一个匿名函数,保持状态并可访问封闭范围可用的变量。 它是通过定义一个类并构造该类型对象而实现的。
看了一下lambda的教程,现总结一下。
一、lambda表达式
() 参数列表
{} 函数体
二、lambda表达式可以这么写
[](){};
这段简短的代码是可以编译运行的。[] 捕获列表没有内容,()表示没有参数传递进去。{}表示函数体没有内容。还可以简写如下
[]{};
参数没有内容,可以省略()所表示的参数列表。简写成了这样。下面看具体例子。
三、例子
1、lambda表达的函数体如果想要使用外部的变量,需要在捕获列表中声明一下。
int i = 10;
[]
{
//cout << i << endl;错误例子,不能通过编译。因为i没有写到捕获列表里面去。
}();
//正确例子
int i = 10;
[i]
{
cout << i << endl; //正确,捕获列表已经声明了i,所以函数体可以使用i
}();
函数体内要使用外部的变量,是需要在捕获列表里面声明的,可以声明为值类型,或者引用类型。这里是值类型。
同时,可以看到,在函数体后面都有一个小括号(),这个小括号,是表示调用了这个lambda表达式。
2、捕获列表可以捕获多个变量。
{
int x = 10, y = 20, z = 30;
[x, y, z]
{
cout << "x=" << x << ",y=" << y << ",z=" << z << endl;
}();
}
捕获列表声明了x,y,z,所以函数体可以使用x,y,z,同时,在函数体后面写上(),调用它,从而能够打印值便于查看。
3、通过“=”号来捕获值
{
int x = 10, y = 20, z = 30, q = 40, p = 50;
[=]//捕获列表写成“=”
{
cout << "x=" << x << endl;
cout << "y=" << y << endl;
cout << "z=" << z << endl;
cout << "q=" << q << endl;
cout << "p=" << p << endl;
}();
}
有时候,需要传递更多的值进去,就会导致捕获列表变大,可以使用“=”,一次性捕获所有的变量值。在函数体后面写上(),调用它,从而能够打印值便于查看。
4、参数列表的使用
{
int x = 20;
char *name = "helloworld";
[x](char *n)//参数列表(char *n)
{
cout << n << endl;
}(name); //调用的时候需要传递参数。
}
要使用参数列表,需要在捕获列表后面写明白,例如,要传递一个char *的参数到lambda的函数体里面,需在[x]后面写上(char *n),随后传递参数并调用它,后面的小括号()就不再是空的,而是有参数的(name)。
5、lambda函数体,改变捕获列表的值
{
int x = 20;
[x]
{
x++;//错误,因为捕获列表是捕获了值,捕获值是不能修改它的。要捕获引用才能修改值。
cout << "x=" << x << endl;
}();
}
{
int x = 20;
[&]//使用&表明,要捕获外部所有变量的引用
{
x++;//正确,此时能修改x的值
cout << "x=" << x << endl;
}();
}
6、通过变量保持lambda表达式的地址。
{
auto fun = []{cout << "helloworld" << endl; };//此时最后面不必写()。
fun();//调用lambda
}
此时,已经不用在函数体后面写上小括号(),因为有了变量保存了lambda的地址,从而通过变量来调用它。
以上是对lambda的人门总结。