Lambda 表达式是 C++11 引入的特性,它允许你定义匿名函数对象(即没有名字的函数)。Lambda 表达式可以在需要函数对象的地方直接定义函数,常用于 STL 算法和回调机制中。
lambda表达式基本语法
[捕获列表](参数列表) -> 返回类型 { 函数体 }
- 捕获列表:用于指定外部变量如何传递给 Lambda 函数。可以捕获局部变量或者全局变量。
- 参数列表:与普通函数相同,定义传入的参数。
- 返回类型:如果 Lambda 有返回值,可以指定返回类型。如果省略,编译器会自动推断。
- 函数体:Lambda 的实现部分。
#include <iostream>
int main() {
auto greet = []() {
std::cout << "Hello, World!" << std::endl;
};
greet(); // 调用 lambda 函数
return 0;
}
输出;
Hello, World!
捕获外部变量
1、按值捕获
#include <iostream>
int main() {
int x = 10;
// 按值捕获变量 x
auto printX = [x]() {
std::cout << "Value of x: " << x << std::endl;
};
printX(); // 输出:Value of x: 10
return 0;
}
输出:Value of x: 10
2、按引用捕获
#include <iostream>
int main() {
int x = 10;
// 按引用捕获变量 x
auto modifyX = [&x]() {
x = 20;
};
modifyX(); // 修改了 x 的值
std::cout << "New value of x: " << x << std::endl; // 输出:New value of x: 20
return 0;
}
输出:New value of x: 20
3、捕获所有变量(按值)
#include <iostream>
int main() {
int x = 10, y = 20;
// 捕获所有外部变量按值
auto printSum = [=]() {
std::cout << "Sum of x and y: " << x + y << std::endl;
};
printSum(); // 输出:Sum of x and y: 30
return 0;
}
输出:输出:Sum of x and y: 30
4、捕获所有变量(按引用)
#include <iostream>
int main() {
int x = 10, y = 20;
// 捕获所有外部变量按引用
auto modifyValues = [&]() {
x = 30;
y = 40;
};
modifyValues(); // 修改了 x 和 y 的值
std::cout << "New values: x = " << x << ", y = " << y << std::endl; // 输出:New values: x = 30, y = 40
return 0;
}
输出:New values: x = 30, y = 40
参数列表和返回类型
带参数的Lambda表达式
#include <iostream>
int main() {
auto add = [](int a, int b) -> int {
return a + b;
};
std::cout << "Sum: " << add(5, 3) << std::endl; // 输出:Sum: 8
return 0;
}
输出:Sum: 8
自动推导返回类型-如果返回类型可以自动推导,可以省略 -> 和类型定义。
#include <iostream>
int main() {
auto multiply = [](int a, int b) {
return a * b; // 自动推导返回类型为 int
};
std::cout << "Product: " << multiply(4, 5) << std::endl; // 输出:Product: 20
return 0;
}
应用
与STL结合
std::sort
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {5, 2, 9, 1, 5, 6};
// 使用 lambda 表达式进行排序
std::sort(nums.begin(), nums.end(), [](int a, int b) {
return a < b; // 升序排序
});
for (int num : nums) {
std::cout << num << " ";
}
return 0;
}
输出:1 2 5 5 6 9
std::for_each
遍历容器
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
std::vector<int> nums = {1, 2, 3, 4, 5};
// 使用 lambda 表达式遍历容器
std::for_each(nums.begin(), nums.end(), [](int num) {
std::cout << num * num << " "; // 输出每个数的平方
});
return 0;
}
输出:1 4 9 16 25