• 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 存储为 functionauto
  • Lambda 嵌套与递归(高级用法)

0 条评论

目前还没有评论...