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并按引用访问其他所有动态变量

    [&,ted] ... {...}
为什么使用lambda

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

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

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

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值