《C++文章汇总》
上一篇介绍了《015-类型转换和C++11新特性》,本文介绍Lamda表达式。
1.Lamda
◼ Lambda表达式
有点类似于JavaScript中的闭包、iOS中的Block,本质就是函数
完整结构: [capture list] (params list) mutable exception-> return type { function body } ✓capture list:捕获外部变量列表
✓params list:形参列表,不能使用默认参数,不能省略参数名
✓ mutable:用来说用是否可以修改捕获的变量
✓ exception:异常设定
✓return type:返回值类型
✓function body:函数体
有时可以省略部分结构
✓[capture list] (params list) -> return type {function body}
✓[capture list] (params list) {function body}
✓[capture list] {function body}
int main(){
([]{
cout << "func()" << endl;
})();
getchar();
return 0;
}
//输出
func()
1.使用指针变量或auto保存lamda表达式
int main(){
([]{
cout << "func()" << endl;
})();
void (*p)() = []{
cout << "func()" << endl;
};
p();
auto p0 = []{
cout << "func()-----" << endl;
};
p0();
p0();
getchar();
return 0;
}
//输出
func()
func()
func()-----
func()-----
2.带参数和返回值的lamda表达式
auto p1 = [](int a,int b)->int{
return a+b;
};
cout << p1(10,20) << endl;
//输出
30
3.lamda本质是函数
4.通常我们可以传入函数指针来调用一个函数,有了lamda表达式之后可以直接将函数写入,一下是传入函数指针的方式来调用函数
int add(int a,int b){
return a+b;
}
int sub(int a,int b){
return a-b;
}
int multip(int a,int b){
return a*b;
}
int divide(int a,int b){
return a/b;
}
int calculate(int v1,int v2,int (*func)(int,int)){
return func(v1,v2);
}
int main(){
cout << calculate(20, 10, add) << endl;
cout << calculate(20, 10, sub) << endl;
cout << calculate(20, 10, multip) << endl;
cout << calculate(20, 10, divide) << endl;
getchar();
return 0;
}
//输出
30
10
200
2
直接传入lamda表达式
cout << calculate(20, 10, [](int v1,int v2){return v1+v2;}) << endl;
cout << calculate(20, 10, [](int v1,int v2){return v1-v2;}) << endl;
cout << calculate(20, 10, [](int v1,int v2){return v1*v2;}) << endl;
cout << calculate(20, 10, [](int v1,int v2){return v1/v2;}) << endl;
4.lamda捕获外界变量,写入[]中,=表示全部捕获,默认都是值捕获
int a=10;
int b=20;
//值捕获
auto func = [a,b]{
cout << a << endl;
cout << b << endl;
};
func();
//输出
10
20
int a=10;
int b=20;
//值捕获
auto func = [=]{
cout << a << endl;
cout << b << endl;
};
func();
//输出
10
20
int a=10;
//值捕获
auto func = [a]{
cout << a << endl;
};
a=20;
func();
//输出
10
5.地址捕获,lamda中修改外界变量的值
auto func = [&a]{
cout << a << endl;
};
a=20;
func();
//输出
20
auto func = [&a]{
a++;
};
func();
cout << a << endl;
//输出
11
6.mutable
auto func = [a]()mutable{
a++;
cout << "lamda =" << a << endl;
};
func();
cout << a << endl;
//输出
lamda =11
10
2.C++14新特性
◼ 泛型Lambda表达式
auto func1 = [](auto v1,auto v2){return v1+v2;};
cout << func1(10, 12.5) << endl;
//输出
22.5
◼ 对捕获的变量进行初始化
int b;
auto func0 = [b=10](){
cout << b << endl;
};
func0();
//这里仍然未初始化
cout << b << endl;
//输出
10
32766
3..C++17新特性
◼ 可以进行初始化的if、switch语句
if (int a = 10;a>10) {
}else{
}
switch (int b = 10;b) {
case 1:
break;
case 2:
break;
case 10:
break;
default:
break;
}