然后,我们在需要的地方,调用它们:
printNumber1(numbers);
printNumber2(numbers);
这里逻辑上并没有问题,但是:
1. 这里我们必须先定义这个函数,才能使用。而这样的函数,可能实际上我们只会使用一次。
2. 当工程大到一定程度,我们可能不记得每个函数的实现(所以函数命名很重要,原谅我这里给函数起了很含糊的名字,你在实际上工程中,请不要这样做),为了知道每个函数的实现,我们不得不查看函数的定义,这无疑给代码的阅读造成了一定的麻烦。
下面,我们来看看使用lambda表达式如何改善上面说的问题。
使用lambda表达式,我们可以这样写:
for_each(numbers.begin(), numbers.end(), [] (int i) {
if(i % 5 == 0) {
cout<<i<<endl;
}
});
for_each(numbers.begin(), numbers.end(), [] (int i) {
if(i > 20) {
cout<<i<<endl;
}
});
这里,我们不用单独定义函数,直接以inline的方式解决了问题。并且,这段代码一气呵成,你很直观的看到了执行的逻辑。
下面,我们再详细看一下lambda表达式中的捕获列表的语法,它可能是以下几种情况中的一种:
[] 不捕获任何变量 [&] 以引用的方式捕获所有变量 [=] 以复制的方式捕获所有变量 [=, &foo] 以引用的方式捕获foo变量,但是以复制的方式捕获其他变量 [bar] 以复制的方式捕获bar变量,不再捕获任何其他变量 [this] 捕获this指针下面,我们再以一个例子说明捕获列表的用法。
这里,我们的需求是:
打印出一个vector<int>的所有数字之和
同样的,我们先以函数的方式来解决这个问题,这个函数的定义可以是这样的:
void printSum(vector<int>& numbers) {
int sum = 0;
for (const int& i : numbers) {
sum += i;
}
cout<<sum<<endl;
}
然后,我们在需要的地方调用这个函数:
vector<int> numbers { 1, 2, 3, 4, 5, 10, 15, 20, 25, 35, 45, 50 };
printSum (numbers);
而假设我们用lambda表达式来写,这样写就可以了:
vector<int> numbers { 1, 2, 3, 4, 5, 10, 15, 20, 25, 35, 45, 50 };
int sum = 0;
std::for_each(numbers.begin(), numbers.end(), [&sum] (const int& i) { sum += i;});
cout<<sum<<endl;
这里,我们用 [&sum]以引用的形式捕获了sum这个变量,并且在lambda表达式中修改了这个变量。
这样写,是不是比定义函数的方式简洁了很多?
对于这种,能够捕获其定义时上下文变量的函数,我们称之为“闭包”,下文还将提到。










