一、lambda表达式
1、c++11新特性
2、lambda表达式就匿名函数(没有名字的函数)
//[]捕获列表 ()参数列表 ->返回值
int c= [](int a, int b) -> int {
//函数体
return a + b;
}(1,2); //传参
3、函数式编程,在多线程、并发中使用广,可以避免多线程同步问题。因为lambda只依赖于内部,且可以内部嵌套,故所有函数都可转为lambda表达式
/*int c = [](int a, int b) {
return [a,b](int x) {
return a + b + x;
}(3);
}(1,2);*/
//adder=λn.(λx.(+x n))
auto f = [](int a, int b) {
return [a, b](int x) {
return a + b + x;
};
};
int c = f(1, 2)(3);
cout << c << endl;
二、匿名函数捕获列表
1、按值捕获
int t = 10;
//按值捕获,捕获的是声明匿名函数时,捕获列表参数的值
auto f = [t] {
cout << t << endl;
};
t = 11;
f(); //输出10
2、按引用捕获
int t = 10;
//按引用捕获
auto f2 = [&t]() {
cout << t << endl;
t = 13;
};
t = 11;
f2(); //输出11
cout << t << endl; //输出13
3、按值/引用捕获所有变量
//捕获列表
int a = 1;
int b = 2;
int c = 3;
int d = 4;
//按值捕获所有的变量
[=]() {
cout << a << "+" << b << endl;
}();
//按引用捕获所有的变量
[&]() {
cout << a++ << "+" << b++ << endl;
}();
//按值和引用方式捕获变量
[a,b,&c,&d]() {
cout << a << "+" << b << endl;
cout << c++ << "+" << d++ << endl;
}();
4、匿名函数使用实例
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
int main() {
vector<int> v = { 1,2,3,4,5 };
/*for (int i = 0; i < v.size(); i++) {
if (v[i] % 2 == 0)
cout << v[i] << "是偶数" << endl;
else
cout << v[i] << "是奇数" << endl;
}*/
//高阶写法 匿名函数
for_each(v.begin(), v.end(), [](int n) {
if (n % 2 == 0)
cout << n << "是偶数" << endl;
else
cout << n << "是奇数" << endl;
});
}