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