C++11 引入的 Lambda 表达式是一种方便快捷的定义匿名函数对象的方式。
Lambda 表达式允许在需要函数对象的地方直接定义和使用匿名函数,极大地提高了C++编程的灵活性和表达力。
一个 Lambda 表达式通常包含以下几个部分:
1. 捕获列表(Capture List)
捕获列表定义了从封闭作用域(通常是定义Lambda的函数)捕获哪些变量,以及如何捕获(通过值或引用)。捕获列表位于Lambda的开头,由一对方括号[]
包围。
[x, &y]
:捕获x
通过值,捕获y
通过引用。[=]
:通过值捕获所有父作用域的变量(不包括this
指针)。[&]
:通过引用捕获所有父作用域的变量。[this]
:捕获当前对象的this
指针,允许访问成员变量和函数。
2. 参数列表(Parameter List)
与普通函数定义类似,参数列表定义了Lambda函数接受的参数。参数列表位于一对圆括号()
中。
[](int x, int y) {...}
:接受两个int
类型的参数。
3. 可选的可变说明符(Mutable Specification)
如果Lambda需要修改它通过值捕获的变量,可以添加mutable
关键字。默认情况下,通过值捕获的变量在Lambda内部是const
的。
[x]() mutable {...}
:允许修改通过值捕获的变量x
。
4. 返回类型(Return Type)
Lambda的返回类型通常可以被自动推导。在需要显式指定返回类型的情况下,可以使用-> ReturnType
语法。
[]() -> int {...}
:显式指定返回类型为int
。
5. 函数体(Function Body)
函数体定义了Lambda表达式的实际执行逻辑,位于一对花括号{}
中。
示例代码
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
int value = 3;
int multiplier = 2;
// 使用Lambda表达式作为参数进行条件过滤
auto it = std::find_if(nums.begin(), nums.end(), [value](int num) {
return num > value;
});
if (it != nums.end()) {
std::cout << "Found a value > " << value << ": " << *it << std::endl;
}
// 使用Lambda表达式进行变量捕获和操作
std::for_each(nums.begin(), nums.end(), [&multiplier](int &num) mutable {
num *= multiplier;
});
// 输出变化后的向量
std::cout << "Modified nums: ";
for (int n : nums) {
std::cout << n << " ";
}
std::cout << std::endl;
return 0;
}
这个示例展示了如何使用 Lambda 表达式进行变量捕获、条件过滤和集合操作。Lambda 表达式使得相关操作更加直观和简洁,是现代 C++ 编程中不可或缺的工具。