最简单的lambda的程序,如下所示:
#include <iostream>
using namespace std;
int main(void)
{ //[] 捕获列表
//-> 返回值
int c = [](int a,int b)->int
{
return a + b;
}(3,4); //直接调用
cout << c <<endl;
return 0;
}
用auto定义lambda返回类型,如下所示:
#include <iostream>
using namespace std;
int main(void)
{ //[] 捕获列表
//-> 返回值
auto fun = [](int a,int b)->int
{
return a + b;
}; //后面这个分号必须添加
int c = fun(2,4);
cout << c <<endl;
return 0;
}
下面对auto fun的解释,如下代码:
[](int a,int b)->int
{
return a + b;
};
//这本质是一个函数体,需要用一个类型去接它,则用auto去接它;
为什么用mutable的使用,如下图所示:
#include <iostream>
using namespace std;
int main(void)
{
int t = 10;
auto f = [t]() mutable ->int{
return ++t;
};
cout<<f()<<endl;
cout<<f()<<endl;
cout<<t<<endl;
return 0;
}
运行结果:
11
12
10
对应运行结果的解释:
lambda匿名函数完成的是值拷贝,调用的时候,有自己的变量并维护着,不会对外部的变量进行修改;
上述代码中,->int 可写可不写;
lambda的捕获时机是:声明匿名函数时;
#include <iostream>
using namespace std;
int main(void)
{
int a = 10;
auto f = [a](){
cout<<a<<endl;
};
f(); //输出10,
a = 11; //再次赋值对应lambda没有意义了;
return 0;
}
按引用捕获,会改变外面值;
声明一个匿名函数的方法,如下代码所示:
auto f = [a](){
cout<<a<<endl;
};
lambda的一个简单应用,数组遍历,查看数组的奇数和偶数方法,代码如下:
#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main(void)
{
vector<int> v = {1,2,3,4,5};
//for_each用法:数组遍历,把得到值以参数形式给lambda表达式
for_each(v.begin(),v.end(),[](int n){
if(n%2 == 0)
cout<<n<<" is even"<<endl;
else
cout<<n<<" is odd"<<endl;
});
return 0;
}
输出结果:
1 is odd
2 is even
3 is odd
4 is even
5 is odd