《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
圖片.png
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;
}
圖片.png