C++ lambda表达式详细讲解1

本文深入探讨了C++的lambda表达式,包括其介绍、忽略参数和返回类型的使用、带参数的lambda以及如何通过捕获列表访问局部变量。通过实例解析,帮助读者理解和应用lambda表达式。

lambda表达式的隐式捕获与显示捕获:https://blog.youkuaiyun.com/readyone/article/details/110948770

1. lambda表达式介绍

一个lambda表达式表示一个可以调用的代码单元,可以将其理解为一个未命名的内联函数

lambda表示式的形式如下:
  [capture list] (parameter list) -> return type {function body}
  
参数说明:

  • capture list:捕获列表,由于lambda可以定义在函数内部,捕获列表就是用来表明使用函数内部的那些参数。
  • parameter list:定义的形参列表
  • return type:返回类型,必须使用**尾置返回(即 -> 符号)**指定返回类型
  • function body:实现的函数体

2. 忽略参数列表和返回类型的lambda表达式

  • lambda表达式中忽略小括号和形参列表等价于指定一个空参列表
  • 如果忽略返回类型,则lambda表达式根据函数体中的代码自动推断返回类型

示例

// 忽略形参列表和返回类型的lambda表达式,自动推断返回类型为int
### 基本概念 C++ Lambda 表达式是一种定义匿名函数对象的方式,它允许在代码中直接编写函数逻辑,而无需事先声明一个函数。这种特性在需要传递简单操作作为参数的场景中非常有用,例如在 STL 算法中作为比较器或操作器使用。Lambda 表达式的语法结构如下: ``` [capture](parameters) -> return_type { body } ``` - **capture**:捕获列表,用于指定 Lambda 表达式可以访问的外部变量。这些变量可以按值或按引用捕获。 - **parameters**:参数列表,类似于普通函数的参数列表。 - **return_type**:返回类型,如果 Lambda 表达式的返回类型可以被编译器推断出来,则可以省略 `-> return_type` 部分。 - **body**:函数体,包含具体的实现逻辑。 Lambda 表达式本质上是一个匿名类的对象,这个类重载了调用运算符 `operator()`,因此它可以像普通函数一样被调用 [^3]。 ### 使用方法 #### 捕获列表 捕获列表决定了 Lambda 表达式能够访问哪些外部变量。变量可以通过值或引用被捕获,具体方式如下: - `[x]`:按值捕获变量 `x`。 - `[&x]`:按引用捕获变量 `x`。 - `[=]`:按值捕获所有外部变量。 - `[&]`:按引用捕获所有外部变量。 - `[this]`:捕获当前对象的 `this` 指针,允许访问成员变量和成员函数 [^3]。 #### 参数列表 参数列表与普通函数相同,用于接收调用时传入的参数。如果 Lambda 表达式不需要参数,可以省略参数列表。 #### 返回类型 如果 Lambda 表达式的返回类型可以被编译器自动推断,那么可以省略返回类型声明。否则,需要显式指定返回类型。 #### 函数体 函数体包含了 Lambda 表达式的具体实现逻辑。这部分可以包含任何合法的 C++ 代码。 ### 使用示例 #### 示例 1:基本使用 ```cpp #include <iostream> #include <vector> #include <algorithm> int main() { std::vector<int> vec = {1, 2, 3, 4, 5}; // 使用 Lambda 表达式作为第三个参数 std::for_each(vec.begin(), vec.end(), [](int x) { std::cout << x << " "; }); return 0; } ``` 在这个例子中,`std::for_each` 算法遍历向量 `vec`,并对每个元素调用 Lambda 表达式,输出每个元素的值。Lambda 表达式没有捕获任何外部变量,接受一个 `int` 类型的参数 `x`,并输出其值 [^4]。 #### 示例 2:捕获外部变量 ```cpp #include <iostream> int main() { int multiplier = 2; // 按值捕获 multiplier auto lambda = [multiplier](int x) { return x * multiplier; }; std::cout << "Result: " << lambda(5) << std::endl; return 0; } ``` 在这个例子中,Lambda 表达式按值捕获了外部变量 `multiplier`,并在函数体内使用该变量进行乘法运算。输出结果为 `Result: 10` [^3]。 #### 示例 3:泛型 LambdaC++14 及以上) ```cpp #include <iostream> int main() { // 泛型 Lambda,接受任意类型的参数 auto lambda = [](auto x, auto y) { return x + y; }; std::cout << "Result (int): " << lambda(3, 4) << std::endl; std::cout << "Result (double): " << lambda(3.14, 2.56) << std::endl; return 0; } ``` 从 C++14 开始,Lambda 表达式支持泛型参数,允许使用 `auto` 关键字作为参数类型。这个例子中的 Lambda 表达式可以处理不同类型的参数,并返回它们的和 [^3]。 ### 总结 C++ Lambda 表达式提供了一种简洁、灵活的方式来定义匿名函数对象。它在 STL 算法、异步编程等场景中广泛应用。通过捕获列表、参数列表、返回类型和函数体的组合,Lambda 表达式可以满足多种编程需求。随着 C++14 和 C++17 的引入,Lambda 表达式的功能得到了进一步增强,包括泛型 Lambda、初始化捕获等功能 [^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值