• lambda表达式


    20210830补充

    可以使用方式在C++中使用匿名函数

    void func(){
        auto f = [](int x, int y){return x > y ? x : y;};
        
        cout << f(1,2) << endl;
    }

    Lambda表达式实际上提供一个匿名函数的特性。

    而匿名函数则是在需要一个函数,又不想去费力命名一个函数的情况下去使用的。

    [捕获列表](参数列表) mutable(可选) 异常属性 -> 返回类型 {
         // 函数体
    }

      略去一般函数名,返回值用一个->形式进行。

    所谓捕捉列表,其实可以理解为参数的一种类型,lambda表达式内部函数体在默认情况下是不能够

    使用函数体外部的变量的,这时候捕获列表可以起到传递外部数据的作用。

        根据传递的行为,捕获列表也可以分为以下几种:

    1)值捕获
        与参数传值类似,捕获的前提是变量可以拷贝,不同之处在于,被捕获的变量在lambda表达式被创建时拷贝

    ,而非调用时才拷贝

    void learn_lambda_func_1() {   
         int value_1 = 1;    
        auto copy_value_1 = [value_1] {      
              return value_1;    
         };    
        value_1 = 100;    
         auto stored_value_1 = copy_value_1();   
         // 这时, stored_value_1 == 1, 而 value_1 == 100.    
        // 因为 copy_value_1 在创建时就保存了一份 value_1 的拷贝
    }

    2)引用捕获

    与引用传参类似,引用捕获保存的是引用,值会发生变化

     void learn_lambda_func2(){
        int value_2 = 1;
        auto copy_value_2 = [&value_2]{
        return value_2;
       };
        value_2 = 100;
        auto stored_value_2 = copy_value_2();
       //此时,stored_value_2 == 100, value_1 == 100
       //这是因为 copy_value_2 保存的是引用
    }

    3) 隐式捕获

    在捕获列表中写一个&或= 向编译器声明采用引用捕获或者值捕获。

    总结:捕获提供了lambda表达式对外部值进行使用的功能,捕获列表最常用的四种形式:

    [] 空捕获列表

    [name1,name2,.....]捕获一系列变量

    [&]引用捕获,让编译器自行推导捕获列表

    [=]值捕获,让编译器执行推导应用列表

    ---------------------------------------------------------------------------------------------------------------------------------

    知识点是参考实验楼大佬的。不提供转载和分享。

    来自《100行C++代码实现线程池》,有需要的童鞋就去开个年费吧。大约也就一天一块钱。

    侵删,底下是传送门。

    https://www.shiyanlou.com/courses/565/labs/1909/document

  • 相关阅读:
    C++中的模板编程
    C++中的抽象类
    C++中的多态
    C++中的继承
    操作符重载(二)
    操作符重载(一)
    C++中的类与对象模型
    [八省联考2018] 劈配 (网络流+二分)
    CF51F Caterpillar (边双+树形DP)
    CF36E Two Paths (欧拉回路+构造)
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/10485461.html
Copyright © 2020-2023  润新知