C++11引入的Lambda表达式是一种非常强大的特性,它允许我们定义匿名函数对象。Lambda表达式常用于回调函数、STL算法中需要传递函数对象的场景等。下面是一个简单的C++ Lambda表达式的实验:
#include <iostream>
#include <vector>
#include <algorithm>
int main() {
// 定义一个包含整数的vector
std::vector<int> numbers = {1, 2, 3, 4, 5, 6, 7, 8, 9};
// 使用Lambda表达式,将每个元素乘以2
std::for_each(numbers.begin(), numbers.end(), [](int n) {
std::cout << n * 2 << " ";
});
std::cout << std::endl;
// 使用Lambda表达式查找vector中的最大元素
auto max_element = std::max_element(numbers.begin(), numbers.end(), [](int a, int b) {
return a < b;
});
std::cout << "Max element is: " << *max_element << std::endl;
// 使用Lambda表达式和一个捕获列表捕获外部变量
int sum = 0;
std::for_each(numbers.begin(), numbers.end(), [&sum](int n) {
sum += n;
});
std::cout << "Sum of elements is: " << sum << std::endl;
return 0;
}
在这个实验中,我们做了以下几件事情:
- 定义了一个包含整数的
std::vector
。 - 使用
std::for_each
算法和Lambda表达式将vector
中的每个元素乘以2并打印出来。Lambda表达式[](int n) { std::cout << n * 2 << " "; }
没有捕获任何外部变量,它只接受一个整数参数n
,并打印出n
的两倍。 - 使用
std::max_element
算法和另一个Lambda表达式查找vector
中的最大元素。Lambda表达式[](int a, int b) { return a < b; }
定义了如何比较两个元素,这里是比较它们的大小。 - 再次使用
std::for_each
算法和一个捕获了外部变量sum
的Lambda表达式来计算vector
中所有元素的和。这里使用了引用捕获[&sum]
,意味着Lambda表达式内部可以直接修改外部变量sum
的值。
Lambda表达式的语法如下:
[capture](parameters) -> return_type { body } |
[capture]
:捕获列表,用于捕获Lambda表达式外部的变量。可以是值捕获[var]
、引用捕获[&var]
或混合捕获[var1, &var2]
。(parameters)
:参数列表,与普通函数参数列表类似。-> return_type
:返回类型,如果Lambda表达式没有返回值,可以省略。{ body }
:Lambda体,即函数体,包含Lambda要执行的代码。
这个简单的实验展示了Lambda表达式的灵活性和强大功能,它允许我们编写简洁、易读的代码,并避免定义冗长的函数或函数对象。