- Lamda表达式作用:
Lambda表达式类似Javascript中的闭包,它可以用于创建并定义匿名的函数对象,以简化编程工作。 - Lambda的语法如下:
[函数对象参数](操作符重载函数参数)->返回值类型{函数体}
vector<int> iv{
5, 4, 3, 2, 1};
int a = 2, b = 1;
int foo = 3;
for_each(iv.begin(), iv.end(), [b](int &x){
cout<<(x + b)<<endl;}); // (1)
for_each(iv.begin(), iv.end(), [=](int &x){
x *= (a + b);}); // (2)
for_each(iv.begin(), iv.end(), [=](int &x)->int{
return x * (a + b);});// (3)
• []内的参数指的是Lambda表达式可以取得的全局变量。
(1)函数中的b就是指函数可以得到在Lambda表达式外的全局变量,如果在[]中传入=的话,即是可以取得所有的外部变量,如(2)和(3) Lambda表达式
• ()内的参数是每次调用函数时传入的参数。
• ->后加上的是Lambda表达式返回值的类型,如(3)中返回了一个int类型的变量
• 下面是各种变量捕获的选项:
o [] 不捕获任何变量
o [&} 捕获外部作用域中所有变量,并作为引用在函数体中使用
o [=] 捕获外部作用域中所有变量,并拷贝一份在函数体中使用
o [=, &b] 捕获外部作用域中所有变量,并拷贝一份在函数体中使用,但是对b变量使用引用
o [b] 捕获b变量并且拷贝一份在函数体使用,同时不捕获其他变量
o [this] 捕获当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
小结: Lamda 表达式主要用于创建匿名的函数对象,简化编码。最重要的就是[函数对象参数] 的使用。对于上面各种变量捕获的选项,需要熟记。
下面给出一些样例:
- [] 不捕获任何变量
std::vector<int> tempVec{
1, 2, 3, 4, 5};
int a = 8;
int b = 2;
for_each(tempVec.begin(), tempVec.end(<