首页后端开发其他后端知识C++中的Lambda表达式用来做什么,怎样使用?

C++中的Lambda表达式用来做什么,怎样使用?

时间2024-03-29 01:06:03发布访客分类其他后端知识浏览1465
导读:这篇文章我们来了解C++中的Lambda表达式的内容,下文对Lambda表达式的作用和使用都有很详细的介绍,有需要的朋友可以参考,感兴趣的朋友接下来就跟随小编来了解看看吧! 概述 C++ 11 中的 Lambda 表达式用于定义并创建...

这篇文章我们来了解C++中的Lambda表达式的内容,下文对Lambda表达式的作用和使用都有很详细的介绍,有需要的朋友可以参考,感兴趣的朋友接下来就跟随小编来了解看看吧!

    概述

    C++ 11 中的 Lambda 表达式用于定义并创建匿名的函数对象,以简化编程工作。Lambda 的语法形式如下:

    [捕获列表] (参数) mutable 或 exception 声明 ->
     返回值类型 {
    函数体}
        
    //计算两个值的和
    auto func = [](int a, int b) ->
     int{
        return a+b;
    }
        ;
    
    //当返回值的类型是确定时,可以忽略返回值
    auto func = [](int a, int b){
        return a + b;
    }
        ;
        
    //调用
    int sum = func(1, 3);
    

    语法分析

    捕获列表

    Lambda 表达式相当于一个类,那么捕获列表就是传递给这个类的类成员。比如:

    class Labmda
    {
        
    public:
        const int test;
    
        Labmda(int value):test(value)
        {
    
        }
    
    public:
        int run(int a, int b)
        {
        
            return a + b + test;
    
        }
    
    }
    
    int main()
    {
        
        int test = 10;
        
        auto func = Labmda(test);
        
        int sum = func.run(1, 3);
    
    }
    
    //使用Lambda 表达式的写法
    int main()
    {
        
        int test = 10;
    
        auto func = [test](int a, int b){
        return a + b + test;
    }
        ;
        
        int sum = func(1, 3);
    
    }
        

    捕获列表有以下格式:

    格式 描述
    [] 不带任何参数
    [=] Lambda表达式之前的局部变量,包括所在类的this,变量按值方式传递
    [& ] Lambda表达式之前的局部变量,包括所在类的this,变量按引用方式传递
    [this] Lambda表达式所在类的this
    [a] Lambda表达式之前的局部变量a的值,也可以传入多个值,如[a , b]
    [& a] Lambda表达式之前的局部变量a的引用

    关键字声明

    关键字声明一般都很少用到,也不建议随便使用,可以忽略不计。

    mutable

    当捕获列表以值的方式传递时有效,加上此关键字后,可以修改Lambda类成员(带const修饰符)。比如:

    int test = 10;
    
    //编译报错,test成员不能修改
    auto func = [test](int a, int b){
        test = 8;
         return a + b + test;
    }
        ;
     
    //编译正常
    auto func = [test](int a, int b)mutable {
        test = 8;
         return a + b + test;
    }
        ;
         

    这里需要注意的是:Lambda类成员test修改之后,并不会改变外部int test的值。

    exception

    exception 声明用于指定函数抛出的异常,如抛出整数类型的异常,可以使用 throw(int)

    示例

    捕获列表按值传递

    int test = 10;
    
    auto func = [=](int a, int b){
        return a + b + test;
    }
        ;
    
    auto func2 = [test](int a, int b){
        return a + b + test;
    }
        ;
        
    int sum = func(1, 3);
         //sum等于14

    这里需要注意的是func表达式中test的值只更新到表达式之前:

    int test = 10;
    
    auto func = [=](int a, int b){
        return a + b + test;
    }
        ;
        
    test = 5;
        
    int sum = func(1, 3);
         //sum还是等于14

    捕获列表按引用传递

    int test = 10;
        
    auto func = [&
    ](int a, int b){
        test = 5;
         return a + b + test;
    }
        ;
        
    auto func2 = [&
    test](int a, int b){
        test = 5;
         return a + b + test;
    }
        ;
        
    int sum = func(1, 3);
         //sum等于9,test等于5

    这里func表达式中test的值就能随时更新:

    int test = 10;
        
    auto func = [&
    ](int a, int b){
        return a + b + test;
    }
        ;
        
    test = 5;
        
    int sum = func(1, 3);
         //sum等于9,test等于5

    总结

    关于C++中的Lambda表达式的内容就介绍到这,上述示例具有一定的借鉴价值,感兴趣的朋友可以参考,对大家学习和理解Lambda表达式会有一定的帮助。最后,想要了解更多大家可以关注其它的相关文章。

    文本转载自脚本之家

    声明:本文内容由网友自发贡献,本站不承担相应法律责任。对本内容有异议或投诉,请联系2913721942#qq.com核实处理,我们将尽快回复您,谢谢合作!


    若转载请注明出处: C++中的Lambda表达式用来做什么,怎样使用?
    本文地址: https://pptw.com/jishu/655318.html
    C++的内联函数有何用处,用法是什么? C语言中的常见排序算法怎样实现?一文带你了解

    游客 回复需填写必要信息