第二十六课:理解C++中的Lambda表达式
学习目标:
- 掌握Lambda表达式的基本语法和概念。
- 学习如何在C++代码中使用Lambda表达式。
- 理解Lambda表达式可以简化哪些编程任务。
学习内容:
-
Lambda表达式概念:
- Lambda表达式是一种定义匿名函数对象的方法,在C++11及其后续版本中被引入。
- 通常用于作为参数传递给算法,或者用于定义在局部作用域中的小函数。
-
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
- Lambda表达式的基本形式如下:
-
捕获列表详解:
[]
不捕获任何外部变量。[=]
按值捕获所有外部变量。[&]
按引用捕获所有外部变量。[x]
只按值捕获外部变量x
。[&x]
只按引用捕获外部变量x
。[=, &x]
按值捕获所有外部变量,但是x
是按引用捕获。
int x = 4; auto lambda = [x](int y) { return x * y; }; std::cout << lambda(5); // 输出: 20
-
常见用途:
- Lambda表达式常用于标准库算法,如
std::sort
、std::for_each
等。 - 可以用来定义回调函数。
- 使得代码更加简洁,无需定义单独的函数或者函数对象。
- Lambda表达式常用于标准库算法,如
练习题:
编写一个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表达式在算法中的应用,以及如何使代码更加简洁易读。