首页 > 编程语言 >C++ lambda函数总结

C++ lambda函数总结

时间:2023-11-07 14:58:04浏览次数:27  
标签:Count 函数 divisible C++ int numbers lambda

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

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

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

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

2 lambda函数的使用
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;});

2.2 返回类型后置lambda

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

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

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的数量

3 测试程序

3.1 代码

/*
Project name :            _33lambda_func
Last modified Date:        2022年5月5日21点04分
Last Version:            V1.0
Descriptions:            C++ 的 lambda用法
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <ctime>
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<int> 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;
}

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。
要在调试停止时自动关闭控制台,请启用“工具”->“选项”->“调试”->“调试停止时自动关闭控制台”。
按任意键关闭此窗口. . .

 

标签:Count,函数,divisible,C++,int,numbers,lambda
From: https://www.cnblogs.com/zzzsj/p/17814975.html

相关文章

  • python初学者学习笔记-第五章-函数
    chapter5/函数5.1函数基础5.1.1函数形式函数是可实现一个或多个功能的代码块;函数的特点:重用性、模块化;Python的内置函数,如print()、len()、min()、max()等;同时,我们也可以自定义函数;5.1.2函数调用参数是函数重要组成部分,python的参数灵活多样;参数类型:默认参数,关键字......
  • Microsoft Visual C++ 14.0 is required.
    问题:配置detectron2的时候报错,MicrosoftVisualC++14.0isrequired.解决:按照上面的网址去下载MicrosoftC++BulidTools这个工具,安装对应的包即可 ......
  • 函数计算 FC 3.0 发布,全面降价,最高幅度达93%,阶梯计费越用越便宜
    作为国内最早布局Serverless的云厂商之一,阿里云在2017年推出函数计算FC,开发者只需编写代码并上传,函数计算就会自动准备好相应的计算资源,大幅简化开发运维过程。阿里云函数计算持续在ServerlessGPU方面投入研发,拥有极致弹性的GPU实例,以及大规格的函数计算性能实例,为承载......
  • 无涯教程-批处理 - EXPAND函数
    此批处理命令从压缩的.cab机柜文件中提取文件。EXPAND-语法EXPAND[cabinetfilename]EXPAND-示例@echooffEXPANDexcel.cab上面的命令将在当前位置提取excel.cab文件的内容。参考链接https://www.learnfk.com/batch-script/batch-script-expand.html......
  • 无涯教程-批处理 - DRIVERQUERY函数
    此批处理命令显示所有已安装的设备驱动程序及其属性。DRIVERQUERY-语法driverqueryDRIVERQUERY-示例@echooffdriverquery上面的命令将显示当前系统上安装的所有设备驱动程序的信息。以下是显示的信息子集的示例。WacomPenWacomSerialPenHIDDKernel......
  • oracle函数大全-字符串处理函数
    字符函数——返回字符值这些函数全都接收的是字符族类型的参数(CHR除外)并且返回字符值.除了特别说明的之外,这些函数大部分返回VARCHAR2类型的数值.字符函数的返回类型所受的限制和基本数据库类型所受的限制是相同的,比如:VARCHAR2数值被限制为2000字符(ORACLE8中为4000字符),......
  • Oracle 日期时间函数
    常用的时间格式在oracle中有yyyy-mm-ddhh24:mi:ss 而在Java中有些区别为yyyy-MM-ddHH:mm:ss这点还是经常容易模糊的。相信很多人都有过统计某些数据的经历,比如,要统计财务的情况,可能要按每年,每季度,每月,甚至每个星期来分别统计。那在oracle中应该怎么来写sql语句呢,这个时候Or......
  • C++禁用windows全局鼠标
    禁用全局鼠标的实现方式与禁用键盘类似,也是通过使用WindowsAPI函数来创建钩子来截取鼠标消息,然后在钩子函数中阻止特定鼠标事件的执行。下面是一个使用C++和WindowsAPI来禁用全局鼠标的示例代码:#include<iostream>#include<Windows.h>//定义全局的钩子句柄HHOOKmouseHook......
  • Matlab命令集--常用字符串函数
    Matlab命令集--常用字符串函数常用函数eval :运行字符串表示的表达式char :将数组变成字符串double:将数字字符串变成数字字符串操作deblank:去掉字符串末尾的空格findstr:查找字符串lower  :转换为小写strcat :字符串连接组合strcmp :字符串比较strcmpi:字符串比较(......
  • lambda表达式与流处理(一)
    14.1.1lambda表达式简介1.lambda表达式用来表示匿名函数,也就是没有函数名字的函数。流处理是Java程序中一种重要的数据处理手动,它用少量的代码便可以执行复杂的数据过滤、映射、查找和收集等功能。2.lambda表达式可以用非常少的代码实现抽象方法。lambda表达式不能独立执行,因......