C++中的Lambda表达式

[复制链接]
发表于 2025-12-29 20:23:47 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。

您需要 登录 才可以下载或查看,没有账号?立即注册

×
Lambda 表达式是当代 C++(C++11 及以后版本)引入的一项功能,它允许你界说匿名函数对象。Lambda 表达式在编写简短的回调函数、算法利用以及必要通报函数对象的地方非常有用。
Lambda 表达式的根本语法如下:
  1. [capture](parameters) mutable -> return_type {
  2.     // function body
  3. };
复制代码

  • capture:捕捉列表,用于指定 Lambda 表达式外部变量的访问权限。按值捕捉(copy)或按引用捕捉(reference)。
  • parameters:参数列表,与平常函数类似。
  • mutable:可选关键字,允许在 Lambda 表达式内部修改按值捕捉的变量。
  • return_type:返回范例,可以省略,编译器会主动推导。
  • function body:函数体,包罗 Lambda 表达式的实现。
下面是一些具体的例子:
1. 根本利用
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. int main() {
  5.     std::vector<int> vec = {1, 2, 3, 4, 5};
  6.     // 使用 Lambda 表达式打印每个元素
  7.     std::for_each(vec.begin(), vec.end(), [](int x) {
  8.         std::cout << x << " ";
  9.     });
  10.     std::cout << std::endl;
  11.     return 0;
  12. }
复制代码
2. 捕捉列表
  1. #include <iostream>
  2. int main() {
  3.     int a = 10;
  4.     int b = 20;
  5.     // 按值捕获 a,按引用捕获 b
  6.     auto lambda = [a, &b]() {
  7.         std::cout << "a: " << a << ", b: " << b << std::endl;
  8.         // 尝试修改 b(按引用捕获)
  9.         b = 30;
  10.         // 尝试修改 a(按值捕获,不允许)
  11.         // a = 40; // 错误:a 是按值捕获的
  12.     };
  13.     lambda();
  14.     std::cout << "After lambda, b: " << b << std::endl;
  15.     return 0;
  16. }
复制代码
3. 利用 mutable 关键字
  1. #include <iostream>
  2. int main() {
  3.     int x = 10;
  4.     // 使用 mutable 关键字允许修改按值捕获的变量
  5.     auto lambda = [x]() mutable {
  6.         x = 20;
  7.         std::cout << "x: " << x << std::endl;
  8.     };
  9.     lambda();
  10.     return 0;
  11. }
复制代码
4. 指定返回范例
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. int main() {
  5.     std::vector<int> vec = {1, 2, 3, 4, 5};
  6.     // 使用 Lambda 表达式计算每个元素的平方,并指定返回类型
  7.     std::vector<int> squares;
  8.     std::transform(vec.begin(), vec.end(), std::back_inserter(squares), [](int x) -> int {
  9.         return x * x;
  10.     });
  11.     for (int square : squares) {
  12.         std::cout << square << " ";
  13.     }
  14.     std::cout << std::endl;
  15.     return 0;
  16. }
复制代码
5. 捕捉全部外部变量(利用 = 或 &)
  1. #include <iostream>
  2. int main() {
  3.     int x = 10;
  4.     int y = 20;
  5.     // 使用 `=` 捕获所有外部变量(按值捕获)
  6.     auto lambda1 = [=]() {
  7.         std::cout << "x: " << x << ", y: " << y << std::endl;
  8.     };
  9.     // 使用 `&` 捕获所有外部变量(按引用捕获)
  10.     auto lambda2 = [&]() {
  11.         std::cout << "x: " << x << ", y: " << y << std::endl;
  12.         x = 30; // 可以修改 x
  13.     };
  14.     lambda1();
  15.     lambda2();
  16.     std::cout << "After lambda2, x: " << x << std::endl;
  17.     return 0;
  18. }
复制代码
通过这些例子,你可以看到 Lambda 表达式在 C++ 中的机动性和强大功能。它们使代码更加简便和可读,特别是在必要通报函数对象或回调函数时。
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表