- C++
C++ Lambda 函数学习笔记
- 2025-5-1 20:10:13 @
📌 什么是 Lambda 函数?
在 C++11 中引入的 Lambda 表达式 是一种方便定义匿名函数对象的方式。你可以把它理解为一个“内联函数”,可以在需要函数的地方直接写函数逻辑,而不需要提前命名函数。
✅ 为什么使用 Lambda?
- 简洁、直观
- 可以访问外部变量(捕获列表)
- 非常适合用于算法中作为参数传递(如
sort()
、for_each()
、find_if()
等)
🧱 Lambda 基本语法
[capture](parameters) -> return_type {
// 函数体
}
部分 | 描述 |
---|---|
[capture] |
捕获列表,用来获取外部变量 |
(parameters) |
参数列表 |
-> return_type |
返回类型(可省略) |
{} |
函数体 |
🚀 使用场景示例(结合 STL 算法)
我们将通过几个常用 STL 算法来演示 lambda 的使用:
std::sort()
std::for_each()
std::find_if()
📚 示例准备:包含头文件和命名空间
#include <iostream>
#include <vector>
#include <algorithm> // 包含 sort, for_each, find_if
using namespace std;
🔢 示例一:使用 Lambda 排序 std::sort()
我们先来看一个对整数向量进行排序的例子,并自定义排序规则。
📌 目标:
对一个整型向量按绝对值升序排序。
✅ 示例代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> nums = {5, -3, 2, -7, 10};
// 使用 lambda 自定义排序规则:按绝对值升序排列
sort(nums.begin(), nums.end(), [](int a, int b) {
return abs(a) < abs(b); // 比较绝对值大小
});
cout << "按绝对值从小到大排序结果:" << endl;
for (int num : nums) {
cout << num << " ";
}
cout << endl;
return 0;
}
💡 输出:
按绝对值从小到大排序结果:
2 -3 5 -7 10
🔁 示例二:遍历元素 std::for_each()
我们用 for_each()
结合 lambda 来打印所有元素。
📌 目标:
遍历并打印每个元素。
✅ 示例代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> nums = {1, 2, 3, 4, 5};
// 使用 lambda 打印每个元素
for_each(nums.begin(), nums.end(), [](int num) {
cout << num << " ";
});
cout << endl;
return 0;
}
💡 输出:
1 2 3 4 5
🔍 示例三:查找满足条件的元素 std::find_if()
我们查找第一个大于 5 的元素。
📌 目标:
找到第一个大于 5 的数字。
✅ 示例代码:
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int main() {
vector<int> nums = {2, 4, 6, 8, 10};
// 使用 lambda 查找第一个大于 5 的元素
auto it = find_if(nums.begin(), nums.end(), [](int num) {
return num > 5;
});
if (it != nums.end()) {
cout << "第一个大于 5 的元素是: " << *it << endl;
} else {
cout << "没有找到大于 5 的元素" << endl;
}
return 0;
}
💡 输出:
第一个大于 5 的元素是: 6
🧠 Lambda 的捕获方式(Capture List)
Lambda 表达式可以通过捕获列表访问外部变量:
捕获方式 | 含义 |
---|---|
[] |
不捕获任何变量 |
[&] |
按引用捕获所有外部变量 |
[=] |
按值捕获所有外部变量 |
[x] |
按值捕获变量 x |
[&x] |
按引用捕获变量 x |
[this] |
捕获当前类的 this 指针(用于类内部) |
示例:使用捕获列表
int factor = 2;
vector<int> nums = {1, 2, 3};
for_each(nums.begin(), nums.end(), [factor](int num) {
cout << num * factor << " ";
});
// 输出: 2 4 6
🧪 综合练习题(尝试自己完成)
题目:
有一个 vector<string>
存储着多个名字,请使用 sort()
和 lambda 对其按字符串长度升序排序,并用 for_each()
打印结果。
✅ 小结
功能 | Lambda 应用示例 |
---|---|
排序 | sort(..., [](a, b){...}) |
遍历 | for_each(..., [](num){...}) |
条件查找 | find_if(..., [](num){...}) |
捕获外部变量 | [=] , [&x] , [x, y] 等 |
🎯 总结
Lambda 是 C++ 中非常强大的工具,它让代码更简洁、逻辑更清晰。尤其在配合 STL 算法时,lambda 能极大提升开发效率和代码可读性。
如果你已经掌握本教程内容,可以继续学习:
- 类成员函数中的 lambda 使用
- Lambda 存储为
function
或auto
- Lambda 嵌套与递归(高级用法)
0 条评论
目前还没有评论...