C++中的Lambda表达式详解

在by_val_lambda中,j被视为三个常量,一旦起头化后不会再改造(能够认为将来只是三个跟父作用域中j同名的常量),而在by_ref_lambda中,j如故在动用父功用域中的值。所以,在采纳Lambda函数的时候,假使急需捕捉的值成为Lambda函数的常量,我们普通会动用按值传递的办法捕捉;相反的,要是急需捕捉的值成成为拉姆da函数运维时的变量,则应该采用按引用方式开始展览捕捉。

int main()

 

1.[capture]:捕捉列表。捕捉列表总是出以往Lambda函数的上马处。实际上,[]是拉姆da引出符。编写翻译器依据该引出符判断接下来的代码是或不是是Lambda函数。捕捉列表能够捕捉上下文中的变量以供Lambda函数使用;

   cout << n << endl;

    int z ;

这段代码主倘诺用来精晓拉姆da表明式中的mutable关键字的。私下认可情状下,Lambda函数总是一个const函数,mutable能够撤除其常量性。根据明确,一个const的分子函数是不能在函数体内修改非静态成员变量的值。比如地方的拉姆da表明式能够视作以下仿函数代码:

    int y = 3;

接下去这几个事例能够观望,能够像调用函数同样使用lambda表达式,可是认为这种艺术和一般性函数的定义与调用就基本上了,这里只是上学运用形式而已。

#include<iostream>
using namespace std;
 
typedef enum
{
    add = 0,
    sub,
    mul,
    divi
}type;
 
class Calc
{
    public:
        Calc(int x, int y):m_x(x), m_y(y){}
 
        int operator()(type i)
        {
            switch (i)
            {
                case add:
                    return m_x + m_y;
                case sub:
                    return m_x – m_y;
                case mul:
                    return m_x * m_y;
                case divi:
                    return m_x / m_y;
            }
        }
 
    private:
        int m_x;
        int m_y;
};
 
int main()
{
    Calc addObj(10, 20);
    cout<<addObj(add)<<endl; //
开掘C++1第11中学,enum类型的行使也变了,更“强”了                                                                                                                                             
    return 0;
}

   auto f = [] (int x, int y) { return x + y; };

#include <iostream>

强烈的效率,代码轻易了,你也少写了一些代码,也去试一试C++中的兰姆da表明式吧。

    srand(time(NULL));

    z = [=]()mutable throw() -> int { int n = x + y; x = y ; y = n;
return n;}();

只是值得注意的是,捕捉列表不容许变量重复传递。上面一些例证便是杰出的再次,会招致编写翻译时期的谬误。举例:

 

 

一段轻便的Code

   int m = [](int x)

透过这几个事例大家可以看到,通过“函数体”后边的‘()’传入参数。

再来壹段越来越晕的代码:

 

#include <ctime>

对此拉姆da这种东西,有的人用的不行爽,而部分人望着都难熬。各持己见,各执一词。不管怎样,作为技师的您,都要会的。这篇小说正是用来弥补自身对C++
拉姆da表明式的认识不足的过错,防止今后在外人的代码中看到了Lambda,还看不懂这种东西,那就丢大人了。

 

    return 0;

by_val_lambda: 11
by_ref_lambda: 11
by_val_lambda: 11
by_ref_lambda: 12

int main()

    sort(a,a+10);

#include<iostream>
using namespace std;
     
typedef enum
{    
    add = 0,
    sub,
    mul,
    divi
}type;
     
int main()
{    
    int a = 10;
    int b = 20;
     
    auto func = [=](type i)->int {
        switch (i)
        {
            case add:
                return a + b;
            case sub:
                return a – b;
            case mul:
                return a * b;
            case divi:
                return a / b;
        }
    };
     
    cout<<func(add)<<endl;
}

 

Lambda表明式的语法通过下图来介绍:

复制代码 代码如下:

拉姆da表达式与STL算法一起行使,本人写测试代码的时候平常用到排序、输出数组什么的,通过上面列举的多少个算法也正如便宜:

    cout<<“before sort: “<<endl;

class const_val_lambda
{
public:
    const_val_lambda(int v) : val(v) {}
    void operator()() const { val = 三; } // 常量成员函数
 
private:
    int val;
};

运转结果为:九

如今我们队lambda表明式的中坚语法已经有1部分询问,上边来举多少个例子。

#include<iostream>                 
using namespace std;               
                                   
int main()                         
{                                  
    int val = 0;                                   
    // auto const_val_lambda = [=](){ val = 3; }; wrong!!!
                                   
    auto mutable_val_lambda = [=]() mutable{ val = 3; };
    mutable_val_lambda();          
    cout<<val<<endl; // 0
                                   
    auto const_ref_lambda = [&]() { val = 4; };
    const_ref_lambda();            
    cout<<val<<endl; // 4
                                   
    auto mutable_ref_lambda = [&]() mutable{ val = 5; };
    mutable_ref_lambda();          
    cout<<val<<endl; // 5
                                   
    return 0;     
}

    return 0;

 

自个儿也不是工学的人,对于Lambda的野史,以及拉姆da与C++的这段渊源,作者也不是很熟知,工夫人,讲究拿代码说事。

}

    int y = 3;

复制代码 代码如下:

 

   cout << n << endl;

粗略来说,拉姆da函数也正是三个函数,它的语法定义如下:

}

    int x = 10;

与常见函数最大的界别是,除了能够使用参数以外,拉姆da函数还是能够通过捕获列表访问一些上下文中的数目。具体地,捕捉列表描述了上下文中什么数据足以被Lambda使用,以及采用格局(以值传递的措施或引用传递的措施)。语法上,在“[]”蕴含起来的是捕捉列表,捕捉列表由多少个捕捉项构成,并以逗号分隔。捕捉列表有以下三种格局:

#include <algorithm>

        
这里假诺我们定义了3个如上图的lambda表明式。现在来介绍途中标有号码的依次部分是何等意思。

1.[=,&a,&b]表示以引用传递的法子捕捉变量a和b,以值传递形式捕捉此外具备变量;
2.[&,a,this]代表以值传递的秘技捕捉变量a和this,引用传递格局捕捉别的具备变量。

        
这里假如大家定义了2个如上海教室的lambda表达式。现在来介绍途中标有号子的种种部分是什么样意思。

   using namespace std;

我是搞C++的

    int z ;

int main()

四.->return-type:重临类型。用追踪再次来到类型方式表明函数的回到类型。我们得以在无需再次来到值的时候也能够会同符号”->”一同轻巧。别的,在回去类型明显的气象下,也足以简轻易单该部分,让编写翻译器对回到类型进行推理;

using namespace std;

    int a[10] = {0};

关于Lambda那个奇葩的事物

 

int main()

复制代码 代码如下:

      { return [](int y) { return y * 2; }(x) + 3; }(5);

int main()

1.[var]代表值传递格局捕捉变量var;
2.[=]代表值传递格局捕捉全数父成效域的变量(包含this);
3.[&var]代表援引传递捕捉变量var;
4.[&]表示援引传递格局捕捉全部父功用域的变量(包含this);
5.[this]表示值传递方式捕捉当前的this指针。

int main()

    srand(time(NULL));

复制代码 代码如下:

    z = [=]()mutable throw() -> int { int n = x + y; x = y ; y = n;
return n;}();

 

看以下一段代码:

图片 1

 

[capture](parameters) mutable ->return-type{statement}

 

    cout<<z<<endl;

直接都在提示本人,笔者是搞C++的;但是当C++11出来那样长日子了,我却绝非随之军事走,发现很对不起自个儿的身价,也幸亏,开掘自个儿也是有段时光未曾写C++代码了。明天见到了C++中的Lambda说明式,即使用过C#的,不过C++的,一向从未用,也不精晓怎么用,就可怜的连Lambda语法都看不懂。好了,这里就对C++中的拉姆da实行1个轻便的总括,就到底对友好的一个松口,笔者是搞C++的,小编是贰个C++
programmer。

    cout<<“before sort: “<<endl;

如上代码在VC10和VC1壹上都能顺风编写翻译通过。以为lambda表明式依旧相比较风趣的语法,也是自家接触的率先个VC1一恢宏。

复制代码 代码如下:

#include <iostream>

运作结果为:3叁

发表评论

电子邮件地址不会被公开。 必填项已用*标注