Lambda函数

223 阅读1分钟

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