0%

lambda表达式

C++11 引入了 lambda 表达式,它是一种用于创建匿名函数的语法。Lambda 表达式提供了一种更加简洁和灵活的方式来编写函数对象,尤其适用于需要传递函数作为参数的情况,比如 STL 算法、函数式编程、事件处理等。

Lambda 表达式的基本语法

Lambda 表达式的一般形式如下:

1
[capture](parameters) -> return_type { body }
  • capture:捕获列表,用于捕获外部变量,可以是值捕获、引用捕获或混合捕获。
  • parameters:参数列表,与普通函数的参数列表类似,可以为空。
  • return_type:返回类型,可以省略,由编译器自动推导。
  • body:函数体,与普通函数体相似,可以包含一系列语句或表达式。

Lambda 表达式的用法示例

  • Lambda 表达式作为函数对象:
1
2
auto sum = [](int a, int b) { return a + b; };
int result = sum(3, 4); // result = 7
  • Lambda 表达式作为 STL 算法的参数:
1
2
std::vector<int> numbers = {1, 2, 3, 4, 5};
int total = std::accumulate(numbers.begin(), numbers.end(), 0, [](int a, int b) { return a + b; });
  • Lambda 表达式与标准库函数配合使用:
1
2
std::vector<int> numbers = {1, 2, 3, 4, 5};
std::for_each(numbers.begin(), numbers.end(), [](int num) { std::cout << num << std::endl; });

Lambda 表达式捕获列表

Lambda 表达式的捕获列表控制了它可以访问的外部变量。捕获列表可以为空,也可以包含一个或多个变量。捕获列表支持值捕获、引用捕获和混合捕获。

  1. 值捕获: 捕获外部变量的值,在 lambda 表达式创建时复制该变量的值。
1
2
int x = 10;
auto func = [x]() { return x; };
  1. 引用捕获: 捕获外部变量的引用,可以修改外部变量的值。
1
2
int y = 20;
auto func = [&y]() { y++; };
  1. 混合捕获: 混合使用值捕获和引用捕获。
1
2
int x = 10, y = 20;
auto func = [&x, y]() { return x + y; };

Lambda 表达式的返回类型推导

在 C++14 中,Lambda 表达式的返回类型可以由编译器根据其返回语句的类型自动推导。

1
auto add = [](int a, int b) { return a + b; };