美文网首页
016-Lamda表达式、C++14和C++17新特性

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

作者: 一亩三分甜 | 来源:发表于2021-10-07 00:00 被阅读0次

    《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

    相关文章

      网友评论

          本文标题:016-Lamda表达式、C++14和C++17新特性

          本文链接:https://www.haomeiwen.com/subject/dbuonltx.html