C++11 引入了 lambda 表达式,这是一种便捷的匿名函数声明方式,允许你在需要函数的地方直接编写函数,而不需要提前定义。引入的主要目的是:让我们可以用类似于函数的表达式用作接受函数指针或者函数符的函数的参数。
Lambda形式具体如下:
[]() {...}
可以看到其使用[]替代了函数的名称(匿名的由来);并且没有声明返回类型。
Lambda具有额外的功能:
也就是说,Lambda可以访问作用域中的任何动态变量,要捕捉使用的变量,可以将其名称放在中括号内。
如果只是指定了变量名,如[z],将按照数值访问变量;如果在名称前面加上&,例如[&count],将按照引用访问变量。[&]可以让你能够按照引用访问所有动态变量,[=]可以让你能够按照值访问所有动态变量。
这两种方式还可以混合使用:例如[a,&b],就是按照值访问ted以及按照引用访问b,[&,ted]让你按照值访问ted,以及按照引用访问其他所有的动态变量,[=,&ted]可以让你按照引用访问ted以及按照值访问其他所有动态变量。
下面用代码具体理解一下该表达式:
使用两个独立的Lambda以及单个Lambda实现寻找可以被3整除,以及13整除的数
#include"Basic.h"
int main() {vector<int> numbers(Size);srand(time(0));generate(numbers.begin(), numbers.end(), rand);cout << "Sample size =" << Size << '\n';//引入的主要目的是:// 让我们可以用类似于函数的表达式用作接受函数指针或者函数符的函数的参数//using lambdasint count3 = count_if(numbers.begin(), numbers.end(), [](int x) {return x % 3 == 0;});cout << "count of numbers divisible by 3:" << count3 << '\n';int count13;for_each(numbers.begin(), numbers.end(), [&count13](int x) {count13 += x % 3 == 0;;});cout << "count of numbers divisible by 13:" << count3 << '\n';//using a single lambdascount3 = count13 = 0;for_each(numbers.begin(), numbers.end(), [&](int x) {count3 += (x % 3 == 0); count13 += (x % 13 == 0);});cout << "count of numbers divisible by 3:" << count3 << '\n';cout << "count of numbers divisible by 13:" << count3 << '\n';
}