C++ Lambda 表达式

Lambda 表达式是 C++11 中引入的一种功能,可以定义匿名的函数对象。Lambda 表达式使得在需要临时使用函数时,可以在代码中直接定义该函数,而不需要定义单独的函数或类。Lambda 表达式通常用于算法中,或者当需要一个小型、一次性的操作时。

1、简介

Lambda 表达式通常用于短小的函数实现,比如在算法中使用回调函数,或者在某些地方临时定义小的函数对象。

语言:捕获列表] (参数列表) -> 返回类型 {函数体},其中,捕获列表 指定哪些外部变量被捕获(可以按值捕获、按引用捕获等)。参数列表 与普通函数一样,指定参数。返回类型(可选) 如果省略,编译器会根据函数体推断返回类型。函数体 Lambda 表达式的实际内容。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    // Lambda 表达式:输出数组中的元素
    std::vector<int> vec = {1, 2, 3, 4};
    std::for_each(vec.begin(), vec.end(), [](int val) { 
        std::cout << val << " "; 
    });
    std::cout << std::endl;

    // Lambda 表达式:计算两个数的和
    auto sum = [](int a, int b) -> int {
        return a + b;
    };
    std::cout << "Sum: " << sum(5, 3) << std::endl;

    return 0;
}

2、简单的 Lambda 表达式

没有捕获任何外部变量的 Lambda,接收一个 int 类型的参数,并输出它的值。

#include <iostream>
#include <vector>
using namespace std;

int main() {
    // 定义一个 Lambda 表达式,输出整数
    auto print = [](int val) { std::cout << val << " "; };

    // 使用 Lambda 打印一个整数
    print(10);  // 输出: 10

    cout << endl;

    // 使用 Lambda 打印一个整数列表
    vector<int> numbers = {1, 2, 3, 4, 5};
    for (int num : numbers) {
        print(num);  // 输出: 1 2 3 4 5
    }

    return 0;
}

3、带有返回类型的 Lambda 表达式

Lambda 表达式接受两个 int 类型的参数并返回它们的和。通过 -> int 指定了返回类型。

#include <iostream>

int main() {
    // Lambda expression for summing two integers
    auto sum = [](int a, int b) -> int { return a + b; };
    
    // Calling the lambda expression
    int result = sum(5, 7);
    
    // Output the result
    std::cout << "The sum of 5 and 7 is: " << result << std::endl;
    
    return 0;
}

4、返回类型推导

C++14 Lambda 表达式可以根据函数体自动推导返回类型,因此可以省略 -> 返回类型 部分。

#include <iostream>

int main() {
    // Lambda expression for multiplying two integers
    auto multiply = [](int a, int b) {
        return a * b;  // Automatically deduced return type
    };
    
    // Calling the lambda expression
    std::cout << multiply(3, 4) << std::endl;  // Output: 12
    
    return 0;
}

5、使用场景

1)作为函数参数传递

Lambda 表达式最常见的使用场景之一是作为函数参数传递,尤其是用于自定义的算法或者处理函数。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {5, 2, 8, 1, 3};

    // 使用 Lambda 表达式自定义排序规则
    std::sort(vec.begin(), vec.end(), [](int a, int b) {
        return a < b;  // 按升序排序
    });

    // 输出排序后的结果
    for (int num : vec) {
        std::cout << num << " ";
    }

    return 0;
}

2)延迟计算或事件处理

Lambda 表达式也可以用于延迟执行的场景,如在异步编程、回调函数中使用。

#include <iostream>
#include <thread>
#include <chrono>

int main() {
    // Lambda 表达式作为回调函数
    std::thread t([]() {
        std::this_thread::sleep_for(std::chrono::seconds(2));
        std::cout << "Task completed!" << std::endl;
    });

    // 等待线程完成
    t.join();

    return 0;
}

3)自定义算法

在自定义算法中使用 Lambda 表达式,可以减少冗长的代码,并提供更灵活的功能实现。

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    std::vector<int> vec = {1, 2, 3, 4, 5, 6, 7};

    // 使用 Lambda 表达式计算大于 4 的元素数量
    int count = std::count_if(vec.begin(), vec.end(), [](int x) {
        return x > 4;
    });

    std::cout << "Count of elements greater than 4: " << count << std::endl;

    return 0;
}
推荐阅读
cjavapy编程之路首页