【C++重点】lambda表达式是什么

发布于:2025-04-01 ⋅ 阅读:(24) ⋅ 点赞:(0)

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


网站公告

今日签到

点亮在社区的每一天
去签到