C++lambda表达式

C++lambda表达式

lambda表达式的引入的主要目的是,让您能够使用表达式用作接受函数指针或函数符的函数的参数

    for_each(numbers.begin(),numbers.end(),[&count13](int x){ count13 += x % 13 == 0; });

for_each是stl库的一个函数,最后一个参数可以接受函数符,函数指针以及lambda表达式

lambda表达式的编写

[]省略了函数名称以及返回值 相当于使用decltype自动推断返回类型

但值得注意的是,只有在函数完全由一条返回语句组成时,自动推断才生效,否则要使用返回类型后置

    auto mod2 = [] (int x) -> int { int y = x ; return y;} ;

可以为lambda表达式指定一个名称,借此重复使用lambda表达式

lambda表达式的名称也可以像普通函数一样使用

    auto mod3 = [] (int x) { return x%3 == 0 ; };
    int count1 = count_if(numbers.begin(),numbers.end(),mod3);
    int count2 = count_if(numbers.begin(),numbers.end(),mod3);
    bool result = mod3(3);
    cout << count1 <<" "<< count2 <<" "<< result <<" "<< endl;

lambda的额外功能

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

把要捕获的变量放在[]内,可以按值或按引用访问变量
按值访问时,直接输入变量名

    [count2] (int x) { return x%3 == 0 ; };

按引用访问时,加上& ;

    /**
    *  [&count13]让lambda能够在其代码中使用count13
    *  由于count13是按引用捕获的,因此在lambda中对于count13的任何修改都会影响到原始count13
    **/
    count13 = 0;
    for_each(numbers.begin(),numbers.end(),[&count13](int x){ count13 += x % 13 == 0; });
    cout << "using lambda : count of numbers divisible by 13: " << count13 <<endl;

[&]能够按引用访问作用域内的所有动态变量 ; [=]能够按值访问作用域内所有动态变量

在这里&让lambda能够按照引用访问所有的动态变量

    count3=count13=0;
    for_each(numbers.begin(),numbers.end(),
    [&](int x) {count13 += x % 13 == 0; count3 += x % 3 ==0;});
    cout << "using lambda : count of numbers divisible by 3: " << count3 <<endl;
    cout << "using lambda : count of numbers divisible by 13: " << count13 <<endl;

捕获和&=也可以组合起来使用,下式表示,按值访问ted并按引用访问其他所有动态变量

扫描二维码关注公众号,回复: 2740820 查看本文章
    [&,ted] ... {...}

为什么使用lambda

距离:一般来说,我们都希望定义位于使用附近的地方,这样在修改代码时,涉及的代码都在附近而不用翻阅很多页去找寻函数的定义的位置

简洁:相对于函数符和函数,lambda表达式都要更简洁

效率:可以在函数内部定义有名称的lambda,lambda的效率取决于编译器的实现方式

功能:lambda表达式具有额外的功能(如上文所示)

猜你喜欢

转载自blog.csdn.net/weixin_38037925/article/details/81607538