zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    2020系统综合实践 第6次实践作业 15组
    2020系统综合实践 第5次实践作业
    2020系统综合实践 第4次实践作业
    2020系统综合实践 第3次实践作业
    2020系统综合实践 第2次实践作业
    系统综合实践_第1次实践作业
    2019 SDN大作业
    2019 SDN上机第7次作业
    第04组&#160;Beta版本演示
    Daily life团队冲刺博客 七
  • 原文地址:https://www.cnblogs.com/wanghao-boke/p/10485461.html
Copyright © 2011-2022 走看看