Lambda函数
案例: 利用STL算法generate()生成1000个随机数
#include <vector>
#include <algorithm>
#include <cmath>
...
std::vector<int> numbers(1000);
std::generate(numbers.begin(),numbers.end(),std::rand);
利用count_if(),计算满足不同条件的个数。
函数指针
bool f3(int x) {return x%3 == 0;}
int count = std::count_if(numbers.begin(),numbers,end(),f3);//返回可以被3整除的个数
函数符
函数符是一个类对象,只是重载了operator()().
class f_mod
{
private:
int dv;
public:
f_mod(int d=1):dv(1){}
bool operator()(int x)
{
return x%3 ==0;
}
}
f_mod obj(3);//调用构造函数创建一个obj对象
bool is_div_by_3 = obj(7);//调用了operator()重载,判断7是否能被3整除
//所以上面的语句可以改写为
int count = std::count_if(numbers.begin(),numbers,end(),f_mod(3));//返回可以被3整除的个数
Lambda函数
使用[]替代了函数名
int count = std::count_if(numbers.begin(),numbers,end(),[](int x){return x%3==0});
仅仅当lambda表达式完全由一条返回语句组成时,自动类型的推断才管用,否则,需要使用新增的返回类型后置语法
[](double x)->double{int y=x;return x-y;}
Lambda额外功能
可以给Lambda指定一个名称
auto fun = [](int x){return x%3==0;};
fun(10);
//这和普通函数的区别是可以在函数内部定义
Lambda可访问作用域内的任何动态变量,要捕获要使用的变量,可将其名称放在中括号内。如果只定义了变量名,如[z],将只能按值访问变量z,如果在名称前面加上&,如[&count],则只能按引用访问count。[&]可以按照引用访问所有的动态变量,而[=]能按值访问所有的动态变量。
[ted,&ed] :能够按照访问ted以及按照引用访问&ed