• 【C++】lambda函数


    27 C++ lambda函数

    27.1 lambda函数简介

    名称lambda来自lambda calculus(lambda演算),一种定义和应用函数的数学系统。这个系统中可以使用匿名函数,对于接收函数指针或伪函数的函数,可以使用匿名函数定义(lambda)作为其参数。

    27.1.1 为什么使用lambda函数?

    距离:定义位于使用的地方附近很有用,由于函数不能定义在函数中,编译器传统意义上也不会内联其他地址被获取的函数,因为函数地址的概念意味着非内联函数,仿函数也可以定义在使用附近,因此,lambda和仿函数比函数近

    简洁:仿函数代码比函数和lambda繁琐

    27.1.2 引入lambda的目的

    让程序员能够将类似于函数的表达式用作接收函数指针或仿函数的函数的参数。典型的lambda是测试表达式和比较表达式,可编写一条返回语句。这使得lambda简洁易于理解,且可自动推断返回类型。

    27.2 lambda函数的使用

    27.2.1 简单使用

    //lambda返回类型相当于使用decltyp根据返回值推断得到;如果lambda不包含返回语句,推断出的返回类型将为void。
    [](int x) {return x % 3 == 0;}
    //使用整个lambda表达式替换函数指针或伪函数构造函数
    count3 = std::count_if(numbers.begin(), numbers.end(),[](int x){return x % 3 == 0;});

    27.2.2 返回类型后置lambda

    //仅当lambda表达式完全由一条返回语句组成时,自动类型推断才管用,否则,需要使用新增的返回类型后置语法
    [](double x)->double{int y = x; return x – y;} // return type is double

    27.2.3 有名字的lambda函数

    auto mod3 = [](int x){return x % 3 == 0;} // mod3 a name for the lambda
    //可以像使用函数一样使用带有名字的lambda函数
    bool result = mod3(z); // result is true if z % 3 == 0

    27.2.4 可访问作用域内任何变量的lambda

    //[z]---按值访问变量
    //[&count]---按引用访问变量
    //[&]---按引用访问所有动态变量
    //[=]---按值访问所有动态变量
    //[&,ted]---按值访问ted,按引用访问其他动态变量
    //其他混合方式也允许
    int count13 = 0;
    std::for_each(numbers.begin(), numbers.end(),
    [&count13](int x){count13 += x % 13 == 0;});//此时count13就可以记录可以整除13的x的数量

    27.3 测试程序

    27.3.1 代码

    /*
    Project name :          _33lambda_func
    Last modified Date:     2022年5月5日21点04分
    Last Version:           V1.0
    Descriptions:           C++ 的 lambda用法
    */
    #include 
    #include 
    #include 
    #include 
    #include 
    const long Size1 = 39L;
    const long Size2 = 10 * Size1;
    const long Size3 = 10 * Size2;
    const long Size4 = 10 * Size3;
    bool f3(int x) { return x % 3 == 0; }
    bool f13(int x) { return x % 13 == 0; }
    int main()
    {
        using std::cout;
        using std::endl;
        std::vector numbers(Size1);
        std::srand(std::time(0));
        std::generate(numbers.begin(), numbers.end(), std::rand);
        // using function pointers
        cout << "使用函数指针*********************************************************" << endl;
        cout << "Sample size = " << Size1 << '\n';
        long count3 = std::count_if(numbers.begin(), numbers.end(), f3);
        cout << "Count of numbers divisible by 3: " << count3 << '\n';
        long count13 = std::count_if(numbers.begin(), numbers.end(), f13);
        cout << "Count of numbers divisible by 13: " << count13 << "\n\n";
    ​
        // increase number of numbers
        numbers.resize(Size2);
        std::generate(numbers.begin(), numbers.end(), std::rand);
        cout << "使用伪函数***********************************************************" << endl;
        cout << "Sample size = " << Size2 << '\n';
        // using a functor
        class f_mod
        {
        private:
            int dv;
        public:
            f_mod(int d = 1) : dv(d) {}
            bool operator()(int x) { return x % dv == 0; }
        };
        count3 = std::count_if(numbers.begin(), numbers.end(), f_mod(3));
        cout << "Count of numbers divisible by 3: " << count3 << '\n';
        count13 = std::count_if(numbers.begin(), numbers.end(), f_mod(13));
        cout << "Count of numbers divisible by 13: " << count13 << "\n\n";
    ​
        // increase number of numbers again
        numbers.resize(Size3);
        std::generate(numbers.begin(), numbers.end(), std::rand);
        cout << "lambda函数简单使用**************************************************" << endl;
        cout << "Sample size = " << Size3 << '\n';
        // using lambdas
        count3 = std::count_if(numbers.begin(), numbers.end(),
            [](int x) {return x % 3 == 0; });
        cout << "Count of numbers divisible by 3: " << count3 << '\n';
        count13 = std::count_if(numbers.begin(), numbers.end(),
            [](int x) {return x % 13 == 0; });
        cout << "Count of numbers divisible by 13: " << count13 << "\n\n";
    ​
        // increase number of numbers again
        numbers.resize(Size4);
        std::generate(numbers.begin(), numbers.end(), std::rand);
        std::generate(numbers.begin(), numbers.end(), std::rand);
        cout << "Sample size = " << Size4 << '\n';
        // using lambdas
        count3 = std::count_if(numbers.begin(), numbers.end(),
            [](int x) {return x % 3 == 0; });
        cout << "Count of numbers divisible by 3: " << count3 << '\n';
        count13 = 0;
        std::for_each(numbers.begin(), numbers.end(),
            [&count13](int x) {count13 += x % 13 == 0; });
        cout << "Count of numbers divisible by 13: " << count13 << "\n\n";
        // using a single lambda
        cout << "可访问作用域内任何变量的lambda***************************************" << endl;
        count3 = count13 = 0;
        cout << "Sample size = " << Size4 << '\n';
        std::for_each(numbers.begin(), numbers.end(),
            [&](int x) {count3 += x % 3 == 0; count13 += x % 13 == 0; });
        cout << "Count of numbers divisible by 3: " << count3 << '\n';
        cout << "Count of numbers divisible by 13: " << count13 << "\n\n";
        cout << "返回类型后置lambda and 有名字的lambda函数****************************" << endl;
        auto mod3 = [](double x)->double {int y = x; return x - y; };// return type is double
        double result = mod3(9.99);
        cout << "result = " << result << endl;
        return 0;
    }

    27.3.2 运行结果

    使用函数指针*********************************************************
    Sample size = 39
    Count of numbers divisible by 3: 13
    Count of numbers divisible by 13: 1
    ​
    使用伪函数***********************************************************
    Sample size = 390
    Count of numbers divisible by 3: 138
    Count of numbers divisible by 13: 23
    ​
    lambda函数简单使用**************************************************
    Sample size = 3900
    Count of numbers divisible by 3: 1339
    Count of numbers divisible by 13: 306
    ​
    Sample size = 39000
    Count of numbers divisible by 3: 13065
    Count of numbers divisible by 13: 2949
    ​
    可访问作用域内任何变量的lambda***************************************
    Sample size = 39000
    Count of numbers divisible by 3: 13065
    Count of numbers divisible by 13: 2949
    ​
    返回类型后置lambda and 有名字的lambda函数****************************
    result = 0.99
    ​
    D:\Prj\_C++Self\_33lambda_func\x64\Debug\_33lambda_func.exe (进程 2692)已退出,代码为 0。
    要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
    按任意键关闭此窗口. . .
  • 相关阅读:
    EasyRecovery2024个人免费版本电脑手机数据恢复软件下载
    前端可视化大屏设置全屏模式方法
    【PMI-PMP®模考三】2022
    【JS】隐式转换
    亚马逊、速卖通、Lazada、Shopee、eBay、wish、沃尔玛、阿里国际、美客多等跨境电商平台,测评自养号该如何利用产品上新期抓住流量?
    [前端必学]精准控制webpack处理文件名hash的问题
    OpenCV C++ 图像 批处理 (批量调整尺寸、批量重命名)
    数据分析与数据挖掘研究之一
    程序员的乐趣是什么?
    【C++深入浅出】日期类的实现
  • 原文地址:https://blog.csdn.net/weixin_44410704/article/details/128039247