您的位置:

Lambda表达式C++11

一、Lambda表达式是什么

Lambda表达式是一种C++11新特性,可以用于创建匿名函数,类似于函数指针,但更加灵活和方便。Lambda表达式以一个包含形参列表和函数体的小括号内开头,后续跟着函数体,函数体可以是任意的有效的C++语句块。Lambda表达式可以访问外部作用域中的变量,这些变量可以被捕获并绑定到Lambda表达式的形参中。


auto sum = [] (int a, int b) -> int {
    return a + b;
};
cout << sum(1, 2) << endl;

上述Lambda表达式用于计算两个整数的和,使用auto关键字进行类型推导,使用[]表示没有捕获任何外部变量,括号内的int a, int b是Lambda表达式的形参列表,-> int是返回类型。

二、Lambda表达式的使用场景

Lambda表达式可以在很多场景下使用,比如常用的算法函数std::sortstd::for_each,可以使用Lambda表达式来自定义排序或者对元素进行处理。


// 使用Lambda表达式对容器进行排序
std::vector<int> vec = {23, 56, 12, 9, 62};
std::sort(vec.begin(), vec.end(), [] (int a, int b) {
    return a < b;
});

// 使用Lambda表达式遍历容器并输出
std::vector<int> vec = {23, 56, 12, 9, 62};
std::for_each(vec.begin(), vec.end(), [] (int a) {
    std::cout << a << " ";
});

上述代码中,第一个Lambda表达式用于对vec进行排序,括号内的int a, int b表示Lambda表达式的两个形参,a < b表示排序规则。第二个Lambda表达式用于遍历容器vec,括号内的int a表示遍历的元素,std::cout << a << " "表示对元素的处理。

三、Lambda表达式的捕获方式

Lambda表达式可以捕获外部作用域中的变量,并绑定到Lambda表达式的形参中。Lambda表达式可以采用三种捕获方式:

  • 值捕获:以=开头,表示以值的方式将变量绑定到形参中。
  • 引用捕获:以&开头,表示以引用的方式将变量绑定到形参中。
  • 混合捕获:同时使用=&,表示以值的方式将除指定变量外的所有变量绑定到形参中,以引用的方式将指定变量绑定到形参中。

// 值捕获示例
int a = 1, b = 2, c = 3;
auto func1 = [a, b] () {
    std::cout << "a = " << a << ", b = " << b << std::endl;
};
func1();

// 引用捕获示例
int a = 1, b = 2, c = 3;
auto func2 = [&a, &b] () {
    a = 4;
    b = 5;
};
func2();
std::cout << "a = " << a << ", b = " << b << std::endl;

// 混合捕获示例
int a = 1, b = 2, c = 3;
auto func3 = [=, &a] () {
    std::cout << "a = " << a << ", b = " << b << ", c = " << c << std::endl;
};
func3();

上述代码中,func1使用值捕获方式,捕获变量abfunc2使用引用捕获方式,引用变量ab,在func2中修改了变量ab的值,输出后发现变量ab的值已经修改。func3使用混合捕获方式,以值的方式捕获变量bc,以引用的方式捕获变量a,在Lambda表达式中使用了所有捕获的变量。

四、Lambda表达式的返回值

Lambda表达式可以有返回值,返回值类型可以使用auto进行类型推导,也可以使用-> 返回类型进行指定。Lambda表达式的返回值使用return语句来返回。


// Lambda表达式的返回值示例
auto func = [] (int a, int b) -> int {
    return a + b;
};
std::cout << func(1, 2) << std::endl;

上述代码中,Lambda表达式使用-> int来指定返回类型为int,使用return语句返回两个整数的和。