Lambda表达式是什么

  • Lambda 表达式是一个匿名函数
  • Lambda 表达式是一个对象
  • Lambda 表达式是当前位置的接口的一个实例对象
  • 编译器会把Lambda 表达式当成形参(这个形参肯定是接口类型)的一个实现了接口方法之后的匿名类的一个实例。
### C++ Lambda 表达式的定义与用法 #### 什么是 Lambda 表达式 Lambda 表达式是 C++11 引入的一种匿名函数机制,它允许在需要函数对象的地方直接定义和使用函数[^3]。通过 Lambda 表达式,可以简化代码结构,提高可读性,同时避免为简单操作专门定义函数的繁琐过程。 #### 基本语法 Lambda 表达式的通用语法如下: ```cpp [captures](parameters) -> return_type { body } ``` - **[captures]**:捕获列表,用于指定 lambda 表达式如何访问外部作用域中的变量。 - **(parameters)**:参数列表,类似于普通函数的参数列表。 - **-> return_type**:返回类型说明符(可选),如果省略,编译器会根据返回值自动推导返回类型。 - **{ body }**:函数体,包含具体的逻辑实现。 #### 捕获列表 捕获列表决定了 lambda 表达式如何访问其外部作用域中的变量。常见的捕获方式包括: - **按值捕获**:将外部变量的值复制到 lambda 表达式中。例如 `[x]`。 - **按引用捕获**:通过引用访问外部变量。例如 `[&x]`。 - **隐式捕获**:使用 `[=]` 按值捕获所有外部变量,或使用 `[&]` 按引用捕获所有外部变量。 #### 示例代码 以下是一些 Lambda 表达式的示例: ##### 示例 1:简单的 Lambda 表达式 ```cpp #include <iostream> using namespace std; int main() { auto add = [](int a, int b) -> int { return a + b; }; // 定义一个加法 lambda cout << "Result: " << add(5, 3) << endl; // 调用 lambda } ``` 上述代码定义了一个接受两个整数并返回它们和的 lambda 表达式[^1]。 ##### 示例 2:捕获外部变量 ```cpp #include <iostream> using namespace std; int main() { int x = 10; auto increment = [x]() -> int { return x + 1; }; // 按值捕获 x cout << "Incremented value: " << increment() << endl; auto modify = [&x]() -> void { x += 5; }; // 按引用捕获 x modify(); cout << "Modified x: " << x << endl; } ``` 在此示例中,`increment` 按值捕获 `x`,而 `modify` 按引用捕获 `x`,从而允许修改外部变量[^2]。 ##### 示例 3:隐式捕获 ```cpp #include <iostream> using namespace std; int main() { int a = 5, b = 3; auto multiply = [=]() -> int { return a * b; }; // 按值捕获所有外部变量 cout << "Product: " << multiply() << endl; auto add = [&](int c) -> int { return a + b + c; }; // 按引用捕获所有外部变量 cout << "Sum: " << add(2) << endl; } ``` 此示例展示了隐式捕获的所有外部变量,并分别按值和按引用进行操作。 #### 特殊用途 Lambda 表达式常用于 STL 算法中,以提供自定义的行为。例如: ```cpp #include <iostream> #include <vector> #include <algorithm> using namespace std; int main() { vector<int> v = {1, 2, 3, 4, 5}; int threshold = 3; // 使用 lambda 表达式过滤大于 threshold 的元素 v.erase(remove_if(v.begin(), v.end(), [threshold](int x) { return x > threshold; }), v.end()); for (auto x : v) { cout << x << " "; } } ``` 这段代码使用 lambda 表达式作为 `remove_if` 的谓词,实现了对容器中元素的过滤操作。 ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值