实际工作中,常常看到的c++ Lambda表达式,如何快速理解呢。
1.Lambada 表达式的来源
来自于函数式编程的概念,有什么优点?
(1)匿名的定义写一个函数,不用再复用函数,也可以让代码更简洁。
(2)使代码更简洁、灵活,在指定地点随写随用。
2.Lambada 表达式的公式
[capture] (params) opt -> ret {body;};
如何理解?
capture: 其实表示lambada 表达式,对变量使用的权限。
params: 就是代表参数。
opt:是函数选项。
ret: 是返回值。
body:是函数体。
3.如何简洁的套用公式
#include<iostream>
using namespace std;
int main()
{
auto intMax = [](int x,int y)->int
{
return x>y? x:y;
};
cout<<"int Max"<<intMax(5,10)<<endl;
}
int Max10
这是最简单的套用公司,其中求最大值,intMax 是对这个lambada表达式的别名,可通过intMax直接调用 。
进一步分析capture选项:
[] :不捕获任何变量
[&]: 按引用的方式,捕获父作用域的变量
[=]:按值传递的方式,捕获父作用域的变量。
[&,=]:拷贝与引用的值互相拷贝。
[var]: 按值传递的方式,捕获变量var
[&var]:按引用的方式,捕获变量&var
[this]:按值传递的方式捕获this指针
[ ] 主要是为了表示lambada表达式可以父作用变量的可访问的权限。
#include<iostream>
using namespace std;
int main()
{
int cur =0;
int cur2=0;
auto intMax = [](int x,int y)->int
{
return x>y? x:y;
};
cout<<"int Max"<<intMax(5,10)<<endl;
auto intAdd_1 = [&]() { cur++;cur2++};//按引用访问cur,cur2 lamda
auto intAdd_2 = [=]() { return cur+1;};// 按值访问,可以访问cur,cur2,cur是拷贝的副本,是右值,不可以cur++,
auto intAdd_3 = [cur] {return cur+1;};//[var]
auto intAdd_4=[&cur,cur2]{ cur++;return cur+cur2;}//
}
// [this] 在类的使用中特别好用
#include<iostream>
using namespace std;
#include <iostream>
using namespace std;
class Lambda
{
public:
void sayHello() {
std::cout << "Hello" << std::endl;
};
void lambda() {
auto function = [this]{
this->sayHello();
};
function();
}
};
int main()
{
Lambda demo;
demo.lambda();
}