就地定义匿名函数,不再需要定义函数对象,大大简化了标准库算法的调用。比如,在C++11之前,我们要调用for_each函数将vector中的偶数打印出来,如代码清单1-24所示。
代码清单1-24 lambda表达式代替函数对象的示例
class CountEven { int& count_; public: CountEven(int& count) : count_(count) {} void operator()(int val) { if (!(val & 1)) // val % 2 == 0 { ++ count_; } } }; std::vector<int> v = { 1, 2, 3, 4, 5, 6 }; int even_count = 0; for_each(v.begin(), v.end(), CountEven(even_count)); std::cout << "The number of even is " << even_count << std::endl;
这样写既烦琐又容易出错。有了lambda表达式以后,我们可以使用真正的闭包概念来替换掉这里的仿函数,代码如下:
std::vector<int> v = { 1, 2, 3, 4, 5, 6 }; int even_count = 0; for_each(v.begin(), v.end(), [&even_count](int val) { if (!(val & 1)) // val % 2 == 0 { ++ even_count; } }); std::cout << "The number of even is " << even_count << std::endl;
lambda表达式的价值在于,就地封装短小的功能闭包,可以极其方便地表达出我们希望执行的具体操作,并让上下文结合得更加紧密。