• C++ 11 lamdba表达式详解


    C++ lamdba 表达式

    Lambda表达式是C++11引入的一个新特性,它允许我们在需要函数对象的地方,使用一种更加简洁的方式定义匿名函数。Lambda表达式通常用于STL中的算法、回调函数、事件处理程序等场合。

    Lambda表达式的基本语法为:

    Copy Code[capture list](parameter list) mutable exception -> return type { function body }

    lamdba表达式在什么场合下使用

    C++11 lambda表达式可以用来创建匿名函数,也就是没有函数名的函数。它们在很多场景下都非常有用,例如:

    1. STL算法中传递自定义的排序、查找或过滤函数

    2. 在多线程编程中创建异步任务和回调函数

    3. 在GUI编程中处理事件处理器和回调函数

    其中

    • Capture clause指定了lambda表达式访问外部变量的方式,可以是传值、引用或者隐式捕获

    • Parameters是参数列表,与普通函数的参数类似

    • Return type是返回值类型,可以省略,编译器会自动推断

    • Function body是函数体部分,包含实际要执行的代码

    例如,以下是一个简单的lambda表达式示例,用于将两个整数相加并输出结果:

    [](int a, int b) -> int { return a + b; }

    在使用lambda表达式时,可以将它作为一个函数对象来使用,例如:

    auto sum = [](int a, int b) -> int { return a + b; };
    int result = sum(10, 20);

    这里我们先定义了一个lambda表达式sum,然后使用它来计算10和20的总和并将结果存储在result变量中。

    需要注意的是,lambda表达式的主要特点是可以在运行时创建,因此比传统的函数指针和函数对象更加灵活和直观。

    完整案例

    #include"iostream"
    #include
    #include
    #include
    using namespace std;
    void ForEath(const vector&values,const function&func)
    {
          for(int value:values)
          func(value);
        // 
    }
    int main()
    {
       vectornums;
       auto sum = [](int a,int b)->int {return a+b;}; // lambda 表达式
       int(*s)(int,int) = [](int n,int m){return n+m;};  //指定返回类型需要使用函数指针形式
    ​
      cout< v = {1, 2, 3, 4};
      
        // 使用lambda函数将每个元素加倍
        std::transform(v.begin(), v.end(), v.begin(), [](int x) { return x * 2; });
      
        for (auto i : v) {
            std::cout << i << " "; // 输出: 2 4 6 8 
        }
        cout<values = {1,2,3,4,5};
       auto it = find_if(values.begin(), values.end(), [](int value) {
        return value > 3;
    });
       cout<<"*it = "<<*it<尾置返回类型语法来手动指定返回类型的 lambda 表达式 
    

    在 C++11 中,lambda 表达式可以使用 auto 关键字来推断返回类型。如果需要手动指定 lambda 表达式的返回类型,可以使用尾置返回类型语法。

    例如,以下是一个使用尾置返回类型语法来手动指定返回类型的 lambda 表达式:

    [](int x) -> double {
      return x * 3.14;
    }

    这个 lambda 表达式接受一个整数参数 x,并返回一个 double 类型的值,该值是 x 乘以 π(即 3.14)的结果。

    请注意,尾置返回类型语法在此处使用了箭头符号 -> 来指定返回类型。在箭头符号之前,我们列出了参数列表,然后在箭头符号之后,我们列出了返回类型。

    如果您不想使用 auto 关键字并手动指定 lambda 表达式的返回类型,可以使用尾置返回类型语法来指定返回类型。例如:

    [](int x) -> double {
      return x * 3.14;
    }

    在这个 lambda 表达式中,-> double 指定了返回类型为 double

    请注意,如果 lambda 表达式的主体只包含单个表达式,则可以省略花括号和 return 关键字,并使用类似于函数的语法表示 lambda 表达式。例如:

    [](int x) -> double { return x * 3.14; }

    在这种情况下,仍然可以使用尾置返回类型语法来指定返回类型。

    #include 
    #include 
    ​
    int main() {
        // 定义一个返回类型为 double 的 lambda 表达式
        std::function myLambda = [](int x) -> double {
            return x * 3.14;
        };
    ​
        // 调用 lambda 表达式并输出结果
        std::cout << "Result 1: " << myLambda(2) << std::endl;
    ​
        // 使用 auto 关键字定义另一个 lambda 表达式,并调用它
        auto anotherLambda = [](int x) {
            return x + 10;
        };
        std::cout << "Result 2: " << anotherLambda(2) << std::endl;
    ​
        return 0;
    }

    在这个示例代码中,我们首先定义了一个返回类型为 double 的 lambda 表达式,并将其分配给一个变量 myLambda,该变量的类型被指定为 std::function,这样可以接受函数对象。

    然后,我们调用 myLambda 并将整数值 2 作为参数传递给它,并将结果输出到标准输出流中。

    接下来,我们使用 auto 关键字定义了另一个 lambda 表达式,并将其存储在变量 anotherLambda 中。在这种情况下,我们没有使用尾置返回类型语法来指定返回类型,因为编译器可以自动推断出返回类型为 int。然后,我们调用 anotherLambda 并将整数值 2 作为参数传递给它,并将结果输出到标准输出流中。

    当您编译并运行上述代码时,输出应该如下所示:

    Result 1: 6.28
    Result 2: 12

    最好的C++学习教程(上篇)——The Cherno CppSeries - 萨达哈鲁的文章 - 知乎 最好的C++学习教程(上篇)——The Cherno CppSeries - 知乎

  • 相关阅读:
    冲刺学习-MySQL-常见问题
    SpringBoot2基础篇(四)—— 基于SpringBoot的SSMP整合案例
    3.6 Windows驱动开发:内核进程汇编与反汇编
    【已解决】Operation timed out 问题
    30道高频Vue面试题快问快答
    golang 线程 定时器 --chatGPT
    tf.ones_initializer
    问:React的setState为什么是异步的?
    Socks5代理和代理IP:网络工程师的多面利器
    JAVA毕业设计酒店管理系统设计与实现计算机源码+lw文档+系统+调试部署+数据库
  • 原文地址:https://blog.csdn.net/weixin_72686492/article/details/133826492