Lambda函数

Lambda函数

Lambda函数

案例: 利用STL算法generate()生成1000个随机数

1
2
3
4
5
6
#include <vector>
#include <algorithm>
#include <cmath>
...
std::vector<int> numbers(1000);
std::generate(numbers.begin(),numbers.end(),std::rand);

利用count_if(),计算满足不同条件的个数。

函数指针

1
2
bool f3(int x) {return x%3 == 0;}
int count = std::count_if(numbers.begin(),numbers,end(),f3);//返回可以被3整除的个数

函数符

函数符是一个类对象,只是重载了operator()().

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
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函数

使用[]替代了函数名

1
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指定一个名称
1
2
3
auto fun = [](int x){return x%3==0;};
fun(10);
//这和普通函数的区别是可以在函数内部定义
  • Lambda可访问作用域内的任何动态变量,要捕获要使用的变量,可将其名称放在中括号内。如果只定义了变量名,如[z],将只能按值访问变量z,如果在名称前面加上&,如[&count],则只能按引用访问count。[&]可以按照引用访问所有的动态变量,而[=]能按值访问所有的动态变量。
  • [ted,&ed] :能够按照访问ted以及按照引用访问&ed
作者

步步为营

发布于

2024-05-08

更新于

2025-03-15

许可协议