目录
C++中的lambda表达式是一种匿名函数,通常用于简化代码,尤其是在处理临时或小型回调函数时。Lambda表达式引入于C++11,并在之后的C++标准中不断增强。它们可以捕获上下文中的变量,生成临时的函数对象,简化了编写内联函数的过程。
1. 语法
C++中的lambda表达式语法如下:
[capture](parameters) -> return_type {
function_body
};
各部分的含义如下:
[capture]
:捕获列表,用于指定 lambda 表达式可以使用的外部变量。(parameters)
:参数列表,和普通函数类似,定义 lambda 表达式的参数。-> return_type
(可选):指定返回类型,如果可以自动推导则可以省略。{}
:函数体,定义 lambda 表达式的逻辑。
2. 示例
-
基本Lambda表达式
auto add = [](int a, int b) { return a + b; }; int result = add(2, 3); // result = 5
在这里,
[]
是捕获列表,表示不捕获任何外部变量。(int a, int b)
是参数列表,表示接收两个整数参数。{ return a + b; }
是函数体,返回两个整数的和。 -
带捕获的Lambda表达式
-
捕获外部变量:
int x = 10; auto increment = [x](int a) { return a + x; }; int result = increment(5); // result = 15
-
捕获外部变量的引用:
int x = 10; auto increment = [&x](int a) { x += a; return x; }; int result = increment(5); // x = 15, result = 15
-
-
捕获所有外部变量
-
捕获所有外部变量的副本(通过值捕获):
int x = 10, y = 20; auto sum = [=]() { return x + y; }; int result = sum(); // result = 30
-
捕获所有外部变量的引用:
int x = 10, y = 20; auto increment = [&]() { x += 5; y += 5; }; increment(); // x = 15, y = 25
-
-
返回类型
如果返回类型无法自动推导,可以显式指定:auto divide = [](int a, int b) -> double { return static_cast<double>(a) / b; }; double result = divide(10, 3); // result = 3.33333
3. 捕获方式
捕获列表中的变量可以通过以下几种方式捕获:
- 按值捕获 (
[x]
):将外部变量x
按值传递给lambda表达式,即生成lambda时会复制该变量的当前值。修改lambda中的变量不会影响外部变量。 - 按引用捕获 (
[&x]
):将外部变量x
的引用传递给lambda表达式,即lambda中对变量的修改会影响外部的变量。 - 捕获所有变量的副本 (
[=]
):自动捕获所有在lambda体中使用的外部变量的副本。 - 捕获所有变量的引用 (
[&]
):自动捕获所有在lambda体中使用的外部变量的引用。 - 混合捕获 (
[=, &x]
或[&, x]
):可以混合使用捕获方式,某些变量按值捕获,某些变量按引用捕获。
4. 可变性(mutable
关键字)
默认情况下,lambda表达式按值捕获的变量是不可修改的。如果需要修改捕获的变量,可以使用 mutable
关键字:
int x = 10;
auto modify = [x]() mutable {
x += 5;
return x;
};
int result = modify(); // result = 15, 但外部的x仍然是10
5. Lambda表达式的用途
-
用于STL算法:
Lambda表达式通常与STL算法结合使用,如std::sort
、std::for_each
等:std::vector<int> vec = {1, 2, 3, 4, 5}; std::for_each(vec.begin(), vec.end(), [](int &n) { n *= 2; }); // vec 变为 {2, 4, 6, 8, 10}
-
回调函数:
Lambda表达式可以用于回调函数,简化了传递临时逻辑的过程。 -
并发编程:
在多线程或并发编程中,lambda表达式可以方便地传递临时任务到线程或任务队列中:std::thread t([]() { std::cout << "Hello from thread!" << std::endl; }); t.join();
总结
C++中的lambda表达式使得编写简洁、灵活的代码更加容易,尤其在需要将临时的函数逻辑传递给其他函数或用于回调时。通过值捕获、引用捕获、自动推导返回类型等功能,lambda表达式为编写更具表现力和灵活性的代码提供了强大支持。
标签:变量,int,捕获,C++,result,表达式,lambda From: https://www.cnblogs.com/keye/p/18399680