016-Lamda表達式、C++14和C++17新特性

《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
最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。