从0开始学C++ 第二十六课:理解C++中的Lambda表达式

第二十六课:理解C++中的Lambda表达式

学习目标:

  • 掌握Lambda表达式的基本语法和概念。
  • 学习如何在C++代码中使用Lambda表达式。
  • 理解Lambda表达式可以简化哪些编程任务。

学习内容:

  1. Lambda表达式概念:

    • Lambda表达式是一种定义匿名函数对象的方法,在C++11及其后续版本中被引入。
    • 通常用于作为参数传递给算法,或者用于定义在局部作用域中的小函数。
  2. Lambda基本语法:

    • Lambda表达式的基本形式如下:[capture](parameters) -> return_type { body }
    • capture是捕获列表,用于指定哪些变量被捕获以及如何捕获(按值或按引用)。
    • parameters是参数列表,与普通函数的参数列表类似。
    • return_type是返回类型,可以不指定,由编译器自动推断。
    • body是Lambda函数体,包含了函数的实现代码。
    auto lambda = [](int a, int b) -> int { return a + b; };
    std::cout << lambda(5, 3); // 输出: 8
    
  3. 捕获列表详解:

    • []不捕获任何外部变量。
    • [=]按值捕获所有外部变量。
    • [&]按引用捕获所有外部变量。
    • [x]只按值捕获外部变量x
    • [&x]只按引用捕获外部变量x
    • [=, &x]按值捕获所有外部变量,但是x是按引用捕获。
    int x = 4;
    auto lambda = [x](int y) { return x * y; };
    std::cout << lambda(5); // 输出: 20
    
  4. 常见用途:

    • Lambda表达式常用于标准库算法,如std::sortstd::for_each等。
    • 可以用来定义回调函数。
    • 使得代码更加简洁,无需定义单独的函数或者函数对象。

练习题:

编写一个C++程序,使用Lambda表达式对一个int类型的vector进行排序,然后使用Lambda表达式遍历该vector并打印每个元素。

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

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

    // 使用Lambda表达式排序
    std::sort(v.begin(), v.end(), [](int a, int b) { return a < b; });

    // 使用Lambda表达式打印每个元素
    std::for_each(v.begin(), v.end(), [](int i) { std::cout << i << ' '; });

    return 0;
}

// 预计输出效果
// 1 2 3 4 5

答案解析:
本练习中,我们先创建了一个std::vector<int>类型的变量v。然后,使用带有Lambda表达式的std::sort函数对其进行排序,排序规则由Lambda表达式提供。之后,再使用带有Lambda表达式的std::for_each算法遍历vector并打印每个元素。这个例子演示了Lambda表达式在算法中的应用,以及如何使代码更加简洁易读。

目录
第二十七课 数据结构入门 - 数组与链表