lambda表达式
捕获列表是 lambda 表达式的重要组成,用于指定 lambda 可以访问的外部变量。通过捕获列表,控制 lambda 对外部作用域中变量的访问方式。
函数

式子

捕获列表的语法
[capture](parameters) -> return_type {
// function body
}
捕获方式
-
按值捕获:
- 语法:
[x]或[=] - 将外部变量的副本传递给 lambda,lambda 内部对该变量的修改不会影响外部变量。
- 示例:
int a = 10; auto lambda = [a]() { return a + 5; }; // a 被按值捕获
- 语法:
-
按引用捕获:
- 语法:
[&x]或[&] - 将外部变量的引用传递给 lambda,lambda 内部对该变量的修改会影响外部变量。
- 示例:
int a = 10; auto lambda = [&a]() { a += 5; }; // a 被按引用捕获 lambda(); // a 现在是 15
- 语法:
-
混合捕获:
- 可以同时按值和按引用捕获不同的变量。
- 示例:
int a = 10, b = 20; auto lambda = [a, &b]() { return a + b; }; // a 按值捕获,b 按引用捕获
捕获列表的特性
- 空捕获列表:
[]表示 lambda 不捕获任何外部变量。 - 捕获所有变量:
[=]表示按值捕获所有外部变量,[&]表示按引用捕获所有外部变量。 - 作用域: 捕获列表中的变量必须在 lambda 定义时可用。
使用场景
- 算法和 STL 函数: 在使用 STL 函数(如
std::sort、std::for_each等)时,常常需要传递自定义的比较或处理逻辑,这时可以使用 lambda 表达式和捕获列表。 - 简化代码: 使用 lambda 表达式可以让代码更简洁,避免了定义单独的函数。
示例
以下是一个简单的示例,展示了捕获列表的用法:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
int threshold = 5;
std::vector<int> numbers = {1, 2, 3, 6, 7, 8};
// 使用 lambda 表达式和捕获列表
auto count = std::count_if(numbers.begin(), numbers.end(), [threshold](int n) {
return n > threshold; // 使用捕获的外部变量 threshold
});
std::cout << "Numbers greater than " << threshold << ": " << count << std::endl;
return 0;
}
在这个例子中,threshold 被按值捕获,lambda 表达式可以使用它来判断数组中的元素。

浙公网安备 33010602011771号