一、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::sort
和std::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
使用值捕获方式,捕获变量a
和b
,func2
使用引用捕获方式,引用变量a
和b
,在func2
中修改了变量a
和b
的值,输出后发现变量a
和b
的值已经修改。func3
使用混合捕获方式,以值的方式捕获变量b
和c
,以引用的方式捕获变量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
语句返回两个整数的和。