在写代码时,我们会遇到这种代码:
sort(points.begin(),points.end(),[](const vector<int>& u,const vector<int>& v){
return u[0] * u[0] + u[1] * u[1] < v[0] * v[0] + v[1] * v[1];
});
我们知道sort()函数第三个参数是函数符,函数指针或者lambda表达式,而这个例子中后面一串长长的就是lambda表达式。
lambda表达式
特性:
1.使用[]替代函数名,没有声明返回类型;
2.返回类型自动推断;
3.可指定名称,比如:
auto mod3 = [](int x){return x % == 0};
4.可访问作用域内的动态变量,有两种方式:
按值访问,[变量名]
加上&,按引用访问,[&变量名]
[=]按值访问所有变量,[&]按引用访问所有;
int count13 = 0;
std::for_each(numbers.begin(),numbers.end(),[&count13](intx){count13 += x % 13 == 0});
为何使用:
使用整个lambda表达式替换函数指针或者函数符构造函数;
其定义和使用是在同一个地方进行的,不需要查看源代码,修改时也可以一目了然,同时将类似于函数的表达式用作接受函数指针或者函数符的函数的参数;
下面是一个使用例子(来自c++prime plus)
#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <ctime>
const long Size = 390000L;
int main()
{
using namespace std;
vector<int> numbers(Size);
srand(time(0));
generate(numbers.begin(),numbers.end(),rand);
cout << "sample size = " << Size << endl;
int count3 = count_if(numbers.begin(),numbers.end(),
[](int x){return x % 3 == 0;});
cout<<"count of numbers divisible by 3:" << count3 << endl;
int count13 = 0;
for_each(numbers.begin(),numbers.end(),
[&count13](int x){count13 += x % 13 == 0;});
cout<< "count of number divisible by 13:" << count13 << endl;
count3 = count13 = 0;
for_each(numbers.begin(),numbers.end(),
[&](int x){count3 += x % 3 == 0;count13 += x % 13 == 0;});
cout<< "count of number divisible by 3:" << count3 << endl;
cout<< "count of number divisible by 13:" << count13 << endl;
return 0;
}
这个例子主要是利用lambda表达式作为参数,判断变量是否可以被3或者13整除
代码输出: