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表达式的灵活性和强大功能,它允许我们编写简洁、易读的代码,并避免定义冗长的函数或函数对象。