• lambda函数详解


    lambda函数的作用就是可以编写内嵌的无名函数,而不必写成独立的函数;

    结构:[]为开始,(参数){函数体}

    例如:

    1.

        auto lambdaFun1 = [](int a) {std::cout << "hello world" << std::endl; };    //定义lambdaFun1函数
        lambdaFun1(1);    //调用lambdaFun1函数

    2.可以指明返回类型

    在()后采用->,称为拖尾返回类型;

    auto lambdaFun2 = [](int a, int b) {return a + b; };
        int a = lambdaFun2(3, 4);
        std::cout << a << std::endl;

    3.lambda函数可以在其封装的作用域内捕捉变量

    float data = 10;
        auto returnNum = [data] {std::cout << "data : " << data << std::endl; };
        returnNum();

    4。当在外捕捉的变量为const类型的时候,我们想在lambda函数体内改变这个const的值,可以引入mutabl来指明这个const转化为非const变量

        int a = 10;
        auto returnNum = [a]() mutable {a *= 2; std::cout << "a :" << a << std::endl; };
        returnNum();
        std::cout << a << std::endl;

    结果是:

    a :20
    10

    注意的是:使用mutable时必须书写();

    5.捕捉的方式:

    [=] : 表示值捕捉所有的变量

    [&] :表示通过引用捕捉所有变量

    [&x] : 表示捕捉变量x,而且还是按引用来捕捉的,

    [x] : 表示按值捕捉变量x

    [=,&x,&y] :表示按值捕捉所有的变量但是除了x和y,以为x和y时按引用捕捉的;

    [this] :捕捉周围的对象

    6.C++14里规定了lambda函数内部可以自己判断类型auto:

    std::vector<int> ints = { 1,2,3,4,5 };
    
        std::vector<double> doubles = { 1.2,2.3,3.4,4.5 };
    
        auto isGreatThan3 = [](auto i) {return i > 3.4; };
    
        auto result = find_if(std::cbegin(ints), std::cend(ints), isGreatThan3);
        if (result != std::cend(ints))
        { 
            std::cout << "find it : " << *result << std::endl;
        }
        else
        {
            std::cout << "no find " << std::endl;
        }
    
        auto result1 = find_if(std::cbegin(doubles), std::cend(doubles), isGreatThan3);
        if (result1 != std::cend(doubles))
        {
            std::cout << "find it : " << *result1 << std::endl;
        }
        else
        {
            std::cout << "no find " << std::endl;
        }

    7.std::function 是一个多态的函数模板包装,类似与函数指针,它可以i绑定任意能调用的对象

    例如:返回一个double,接收两个整形参数的函数包装定义如下:

      std::function<double(int , int )> myFunction;

      也可以给lambda表达式指定名称,并从函数中返回;

      std::function<int(void)> lambdaName(int x)

      {

        return [x]{return 2*x;};    //这里不能按引用来传递x;

      }

      说明:这个函数主题上时创建了一个lambda表达式,可见lambda接受的参数无,返回的是int类型;

      可以通过下列方式来调用;

      std::function<int(void)> fn = lambdaName(5);

  • 相关阅读:
    【转载】零基础学Support Vector Machine(SVM)
    【转载】前向传播算法(Forward propagation)与反向传播算法(Back propagation)
    python 3.5 解决csv 读入中的'utf-8' codec can't decode办法
    pandas用法大全
    南阳理工OJ 题目168.房间安排问题与题目14.会场安排问题
    C++中IO设置数字精度问题
    C++中memset()函数笔记
    Java 编程命名规范
    数据类型内存分配--js基础
    对象--js基础
  • 原文地址:https://www.cnblogs.com/boost/p/10579199.html
Copyright © 2020-2023  润新知