c++ lambda表达式

一、lambda语句介绍

在cppreference中对lambda的解释是:一个能够捕获作用域中变量的未命名函数对象

个人认为就是一个用于快速定义一个匿名函数的语句

使用格式

1.capture子句,lambda的核心,通过改变[ ]中的值,来设定捕获的范围

2.参数列表 ,可选,用于确定捕获参数的类型

3.mutable,可选,用于确定捕获参数是否可以更改

4.throw(),可选,表示抛出异常

5.返回值类型,可选,表示函数体最后的返回值是什么类型的

6.函数体

二、lambda的应用

    std::vector<int> v = {5,7,4,2,9,1};
    sort(v.begin(), v.end(), [](int a, int b){ 
        return a > b; 
    });
//自定义sort的排序为降序

这里我们的捕获列表[ ]是空的,代表着不捕获任何的外部变量,也就是说,它的作用范围只在sort内

1.值捕获

即在[ ]中写入你想要捕获的变量,如下就表示我要捕获a这个变量,然后输出它

auto pr1 = [a]{std::cout << a << " " << std::endl;};

2.引用捕获

它与值捕获的区别在于,值捕获无法在函数体内修改捕获的外部变量的值,但是引用捕获可以,如下

    int a = 4;
    auto pr1 = [a]{
        std::cout << a << " " << std::endl;
        a++;
//这里编译器会报错,是“表达式是可修改的左值”
    };
    pr1();
    auto pr2 = [&a]{
         std::cout << a << std::endl;
         a++;
//这里编译器不会报错,因为是引用捕获
    };

3.通用捕获

在上述的两种中,我们都是明确了要捕获的变量,如果我们要根据函数体内的需要来捕获就可以用[=]或者[&]

其中[=]代表着值捕获,[&]代表着引用捕获

    int a = 4;
    int b = 5;
    auto pr1 = [=]{
        std::cout << a << " " << std::endl;
        std::cout << b << std::endl;
    };
    pr1();
    auto pr2 = [&]{
         std::cout << a << std::endl;
         std::cout << ++b << std::endl;
    };
    pr2();

 

当我们想在值捕获中修改的时候就需要用到mutable这样就可以在函数体内修改值

 

posted @ 2023-11-12 19:17  clinx000  阅读(78)  评论(0)    收藏  举报