c++11 lambda表达式

 lambda 表达式使用一对方括号作为开始的标识,类似于声明一个函数,只不过这个函数没有名字,也就是一个匿名函数,其返回值是自动推断的(函数体足够简单的情况),当然也可以指定返回值类型。
    c++11 lambda语法形式:[=,&p](int a)->int mutable {return a}(3.5)
    语法解析:
    []:引入符,表示lambdad表达式捕获同范围变量的形式(值传递,引用)
    ():lambda表达式实参
    -> int: 指定lambda表达式的返回值类型
    mutable: 改变值传递进来的变量,但是只是在lambda函数内部改变改变量的值,因为是值传递所以该变量的值实际上是没有改      变的
    {}:函数体部分
    (3.5):lambda表达式实质是函数对象,实参为3.5


    lambda 引入符说明:
    []      // 不捕获任何外部变量
    [=]     // 以值的形式捕获所有外部变量
    [&]     // 以引用形式捕获所有外部变量
    [x, &y] // x 以传值形式捕获,y 以引用形式捕获
    [=, &z] // z 以引用形式捕获,其余变量以传值形式捕获
    [&, x]  // x 以值的形式捕获,其余变量以引用形式捕获

    另外有一点需要注意。对于[=]或[&]的形式,lambda 表达式可以直接使用 this 指针。但是,对于[]的形式,如果要使用 this 指针,必须显式传入:
    [this]() { this->someFunc(); }();

实例:
#include
#include
#include
#include
using namespace std;

int main()
{
    double dValue1 = [](double a) -> int{
        return std::abs(a); 
    }(-3.5);//指定返回值类型为int 输出3
    cout << dValue1 << endl;
    std::vector vecValue;

    for (int i = 0;i < 10;i++)
        vecValue.push_back(i);

    int nVariable = 9;
    int nDp = 23;
    std::for_each(vecValue.begin(), vecValue.end(), [=,&nDp ](int nValue) mutable{
        if (nValue== 0)
        {
            nVariable ++;
            cout <<" lambda外部变量nVariable (值传递):"<< nVariable << endl;//输出10
            dp++;
            cout << "lambda外部变量nDp (引用):" << nDp << endl;//输出24
        }
        cout << nValue;
    });
    cout << endl;
    cout <<"变量nVariable (引用)调用后:" << nVariable << endl;//值传递,输出9
    cout << "变量nDp (引用)调用后:" << nDp << endl;//引用传递,输出24

    system("pause");
    return 0;
}

你可能感兴趣的:(c++,lambda表达式,标准库,c++11)