首页 > 代码库 > C++11 lambda表达式基本用法

C++11 lambda表达式基本用法

#include <iostream>
using namespace std;


void func1()
{
    cout<<"lambda表达式,值捕获,类似值传递"<<endl;
    size_t v1=30;//size_t为unsigned int无符号整数
    size_t v2=30;
    size_t v3=30;
    auto f=[v1,v2,v3]{return v1+v2+v3;};//lambda表达式中[]里面放的是要传递的参数,可以放多个。
    v1=2;
    cout<<f()<<endl;
    cout<<endl;
    //因为这是类似值传递,所以v1在改变前就已经给了f,所以不会变。注意隐式捕获得到的变量不能被改变,只能使用其值不能改变
    //可以理解成[const v1]当然你不能这样写只是可以这么认为
}

void func2()
{
    cout<<endl;
    cout<<"lambda表达式,引用捕获,类似引用传递"<<endl;
    size_t v1=30;//size_t为unsigned int无符号整数
    size_t v2=30;
    size_t v3=30;
    auto f=[&v1,v2,&v3]{return v1+v2+(v3++);};//lambda表达式中[]里面放的是要传递的参数,可以放多个。这里v1,v3为引用,v2为值传递

    cout<<"引用值没变前:"<<endl;
    cout<<"v1="<<v1<<endl
        <<"v2="<<v2<<endl
        <<"v3="<<v3<<endl;
    cout<<f()<<endl;

    v1=40;
    cout<<"引用值改变后:"<<endl;
    cout<<"v1="<<v1<<endl
        <<"v2="<<v2<<endl
        <<"v3="<<v3<<endl;//之前调用了一次f所以v3会加1
    cout<<f()<<endl;

    cout<<endl;
    //因为这是类似引用传递,所以v1改变后f返回的值也会对应的改变。而且在f中也引用用v3并且v3进行了自增操作,所以第二次输出v3时的值是31

}

void func3()
{
    cout<<endl;
    cout<<"lambda表达式,隐式值捕获"<<endl;
    size_t v1=30;//size_t为unsigned int无符号整数
    size_t v2=20;
    size_t v3=10;
    auto f=[=,&v2]
    {
        v2=v1+v3;
            
    };
    //lambda表达式中[]里面放的是要传递的参数,可以放多个。
    //第一个为=,第二个为&v2,表示除了v2是引用传递以外,其他从外面来的参数都是值传递,而隐式传递同时只能用一种。要么引用要么值传递
    //值传递只能被使用,不能被改变,如果企图改变值传递的值编译会报错
    cout<<"没变前:"<<endl;
    cout<<"v1="<<v1<<endl
        <<"v2="<<v2<<endl
        <<"v3="<<v3<<endl;

    cout<<"改变后:"<<endl;
    f();
    cout<<"v1="<<v1<<endl
        <<"v2="<<v2<<endl
        <<"v3="<<v3<<endl;
    cout<<endl;

}

void func4()
{
    cout<<endl;
    cout<<"lambda表达式,隐式引用捕获"<<endl;
    size_t v1=30;//size_t为unsigned int无符号整数
    size_t v2=20;
    size_t v3=10;
    auto f=[&,v2]
    {
        v1++;
        v3=v2;
    };
    //lambda表达式中[]里面放的是要传递的参数,可以放多个。
    //第一个为&,第二个为v2,表示除了v2是值传递以外,其他从外面来的参数都是引用传递,而隐式传递同时只能用一种。要么引用要么值传递
    cout<<"没变前:"<<endl;
    cout<<"v1="<<v1<<endl
        <<"v2="<<v2<<endl
        <<"v3="<<v3<<endl;

    cout<<"改变后:"<<endl;
    f();
    cout<<"v1="<<v1<<endl
        <<"v2="<<v2<<endl
        <<"v3="<<v3<<endl;
    cout<<endl;

}

void func5()
{
    cout<<"lambda表达式,可变的值捕获"<<endl;
    size_t v1=30;//size_t为unsigned int无符号整数
    size_t v2=20;
    size_t v3=10;
    auto f=[v1,v2,v3]() mutable 
    {
        v1=v2+v3;
        v2=v1+v3;
        v3=v1+v2;
    };
    //lambda表达式中[]里面放的是要传递的参数,可以放多个。


    cout<<"v1="<<v1<<endl
        <<"v2="<<v2<<endl
        <<"v3="<<v3<<endl;

    cout<<endl;
    //看到输出结果是不是觉得很奇怪吗,不是说可变吗,结果值还是一样。这里的可变是指在lambda表达式中原本值传递的参数只能被获得值。不能对其进行其他操作
    //mutable的原因,使其可以像函数里的变量一样被使用,可以理解成函数中的值传递。函数中的值传递就是可以对其参数进行任何操作。
}

void func6()
{
    cout<<"lambda表达式,指定返回类型"<<endl;
    auto f=[](int i)->int  
    {
        return i;
    };
    //lambda表达式中[]里面放的是要传递的参数,可以放多个。
    cout<<f(50)<<endl;
    //要指定lambda表达式的返回类型我们必须用->来设置
    cout<<endl;
   
}


void main(void)
{
    func1();//值捕获
    func2();//引用捕获
    func3();//隐式值传递
    func4();//隐式引用传递
    func5();//可变lambda
    func6();//指定返回类型
    system("pause");
}


如果有什么不对的地方请大家指出,这几天整理的lambda表达式的基本用法


C++11 lambda表达式基本用法