c++++ lambda 表达式中捕获变量的机制可分为两种类型:按值捕获(复制定义作用域中的变量)和按引用捕获(直接访问定义作用域中的变量)。按引用捕获允许 lambda 表达式更改定义作用域中的变量,而按值捕获不会。
C++ Lambda 表达式中捕获变量的机制
Lambda 表达式是 C++ 中的匿名函数,可以捕获其定义作用域中的变量。捕获变量的机制决定了 Lambda 表达式如何在运行时访问这些变量。
捕获变量的两种类型:
值捕获:复制定义作用域中的变量的值并存储在 Lambda 表达式中。
引用捕获:获取对定义作用域中变量的引用,并在运行时直接访问它们。
按引用捕获变量:
立即学习“C++免费学习笔记(深入)”;
int global_variable = 10; auto lambda = [&](int x) { global_variable += x; cout << "Global variable: " << global_variable << endl; }; lambda(5); // 输出:Global variable: 15
在上面的示例中,Lambda 表达式通过 [&] 捕获符按引用捕获 global_variable 变量。更改 Lambda 表达式中的 global_variable 也会在定义作用域中更新其值。
按值捕获变量:
int global_variable = 10; auto lambda = [=](int x) { int local_variable = x; // Lambda 表达式中独立的本地变量 cout << "Local variable: " << local_variable << endl; }; lambda(5); // 输出:Local variable: 5
在这个示例中,Lambda 表达式通过 [=] 捕获符按值捕获 global_variable 变量。在 Lambda 表达式中更改 global_variable 不会影响定义作用域中的值。
实战案例:
假设您有一个向量,您想要创建一个 Lambda 表达式来查找向量中所有大于某个指定值的元素。以下是实现方法:
vector<int> numbers = {1, 3, 5, 7, 9}; int threshold = 5; auto lambda = [&numbers, threshold](int n) { return n > threshold; }; // 使用 std::find_if()/lambda查找符合条件的元素 auto it = std::find_if(numbers.begin(), numbers.end(), lambda); if (it != numbers.end()) { cout << "符合条件的元素: " << *it << endl; } else { cout << "没有符合条件的元素。" << endl; }
在这个示例中,Lambda 表达式按引用捕获了 numbers 和 threshold 变量。std::find_if() 函数用此 Lambda 表达式来遍历向量并查找符合条件的元素。
以上就是C++ lambda 表达式中捕获变量的机制的详细内容,更多请关注本网内其它相关文章!