• 【C++11】 lambda表达式



     
    i.e.
    int x = 10;
    int y = 20;
    int z = [&]{
    x = x * x;
    y = y * y;

    return x + y;
    }();

    上面z后面以[]开头的为一个lambda表达式,
    中括号里可以有用来表示捕捉符号,等号"="表示以值传递的方式使用lambda外部变量, 与号"&"表示引用方式使用;
    mutable表示在lambda表达式中可以对变量进行修改lambda外部的变量的值。

    如下:
    auto add = [=](int param1, int param2) {
    param1 += 100; //error, 不让修改lambda外部的变量x
    param2 += 200 ; //error, 不让修改lambda外部的变量y
    return x + y;
    };

    修改方法如下:
    int x = 10;
    int y = 20;

    auto add = [=](int param1, int param2) mutable {
    x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
    y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
    return x + y;
    };

    int sum = add(100, 200);
    执行完后: x == 10, y == 20,这是因为中括号"[]"里是等号"=", 表示值传递方式使用lambda外部变量,不会修改原来的值, 执行完后sum == 330,

    上面是以值传递的方式使用lambda外部变量的值, 而且没有写明lambda表达式返回类型, 因为lambda表达式里有return语句,因此lambda表达式的返回值为return返回的值类型,如果接收方和return返回类型不匹配则可以自动隐式转换,如果不能转换则报错。

    如果写明返回类型则如下:
    auto add = [=](int param1, int param2) mutable ->int {
    x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
    y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
    return x + y;
    };

    如果是引用传递则如下:
    auto add = [&](int param1, int param2) mutable     ->int {
    x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
    y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
    return x + y;
    };
    以应用方式使用lambda外部变量,
    int result = add(100, 200);
    执行完后result == 330, x == 110, y == 220。

    ------------------------------------------------------------------------------------
    auto add = [&](int param1, int param2) mutable   ->float {
    x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
    y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
    return x + y;
    };

    int result = add(10, 20); //隐式转换
    执行完后result == 330(330.0F转换而来), x == 110, y ==220 。


    -------------------------------------------------------------------------
    lambda表达式还可以作为函数实参,如下:
    #include <vector>
    #include <algroithm>
    using namespace std;

    vector<int> iVec(10); //10个元素的vector
    for(auto iter = iVec.begin(); iter != iVec.end(); ++ iter)
    {
    *iter = 2; //每个元素都为2;
    }
    for(auto& i : iVec) //引用方式
    {
    i = i * 2; //每个元素都乘以2;
    }

    int sum = 0;

    //每个元素的值累加;
    for_each(iVec.begin(), iVec.end(),
    [&](int n) { int m = n; sum += m }
    );

    执行完后 sum == 40.



    参考资料:http://www.cnblogs.com/L-hq815/archive/2012/08/23/2653002.html
    http://blog.jobbole.com/44015/#jtss-tqq



  • 相关阅读:
    Appium(一):java环境、AndroidSDK环境
    SQL Server Merge语句的使用
    ASP.NET MVC下判断用户登录和授权的方法
    javascript的错误处理
    javascript的封装实例
    Javascript的封装
    ASP.NET MVC的请求生命周期
    Asp.Net页面生命周期
    SQL注入原理
    ASP.NET MVC:窗体身份验证及角色权限管理示例
  • 原文地址:https://www.cnblogs.com/cuish/p/3226508.html
Copyright © 2020-2023  润新知