马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有账号?立即注册
×
Lambda 表达式是当代 C++(C++11 及以后版本)引入的一项功能,它允许你界说匿名函数对象。Lambda 表达式在编写简短的回调函数、算法利用以及必要通报函数对象的地方非常有用。
Lambda 表达式的根本语法如下:- [capture](parameters) mutable -> return_type {
- // function body
- };
复制代码
- capture:捕捉列表,用于指定 Lambda 表达式外部变量的访问权限。按值捕捉(copy)或按引用捕捉(reference)。
- parameters:参数列表,与平常函数类似。
- mutable:可选关键字,允许在 Lambda 表达式内部修改按值捕捉的变量。
- return_type:返回范例,可以省略,编译器会主动推导。
- function body:函数体,包罗 Lambda 表达式的实现。
下面是一些具体的例子:
1. 根本利用
- #include <iostream>
- #include <vector>
- #include <algorithm>
- int main() {
- std::vector<int> vec = {1, 2, 3, 4, 5};
- // 使用 Lambda 表达式打印每个元素
- std::for_each(vec.begin(), vec.end(), [](int x) {
- std::cout << x << " ";
- });
- std::cout << std::endl;
- return 0;
- }
复制代码 2. 捕捉列表
- #include <iostream>
- int main() {
- int a = 10;
- int b = 20;
- // 按值捕获 a,按引用捕获 b
- auto lambda = [a, &b]() {
- std::cout << "a: " << a << ", b: " << b << std::endl;
- // 尝试修改 b(按引用捕获)
- b = 30;
- // 尝试修改 a(按值捕获,不允许)
- // a = 40; // 错误:a 是按值捕获的
- };
- lambda();
- std::cout << "After lambda, b: " << b << std::endl;
- return 0;
- }
复制代码 3. 利用 mutable 关键字
- #include <iostream>
- int main() {
- int x = 10;
- // 使用 mutable 关键字允许修改按值捕获的变量
- auto lambda = [x]() mutable {
- x = 20;
- std::cout << "x: " << x << std::endl;
- };
- lambda();
- return 0;
- }
复制代码 4. 指定返回范例
- #include <iostream>
- #include <vector>
- #include <algorithm>
- int main() {
- std::vector<int> vec = {1, 2, 3, 4, 5};
- // 使用 Lambda 表达式计算每个元素的平方,并指定返回类型
- std::vector<int> squares;
- std::transform(vec.begin(), vec.end(), std::back_inserter(squares), [](int x) -> int {
- return x * x;
- });
- for (int square : squares) {
- std::cout << square << " ";
- }
- std::cout << std::endl;
- return 0;
- }
复制代码 5. 捕捉全部外部变量(利用 = 或 &)
- #include <iostream>
- int main() {
- int x = 10;
- int y = 20;
- // 使用 `=` 捕获所有外部变量(按值捕获)
- auto lambda1 = [=]() {
- std::cout << "x: " << x << ", y: " << y << std::endl;
- };
- // 使用 `&` 捕获所有外部变量(按引用捕获)
- auto lambda2 = [&]() {
- std::cout << "x: " << x << ", y: " << y << std::endl;
- x = 30; // 可以修改 x
- };
- lambda1();
- lambda2();
- std::cout << "After lambda2, x: " << x << std::endl;
- return 0;
- }
复制代码 通过这些例子,你可以看到 Lambda 表达式在 C++ 中的机动性和强大功能。它们使代码更加简便和可读,特别是在必要通报函数对象或回调函数时。
|