目录
一,lambda表达式
lambda表达式相当于就是一个匿名函数。
使用示例:
#include<iostream>
#include <algorithm>
using namespace std;
int main()
{
int x[]={4,6,2,5};
sort(x,x+sizeof(x)/sizeof(int),[](int a,int b){return a>b;});
for(int i=0;i<sizeof(x)/sizeof(int);i++)cout<<x[i]<<" ";
return 0;
}
其中,[](int a,int b){return a>b;} 就是一个lambda表达式,相当于仿函数 greater<int>()
二,lambda表达式各部分用法
1,[]
[]用来控制lambda表达式中可以使用哪些外部变量。
(1)&是引用所有变量
#include<iostream>
#include <algorithm>
using namespace std;
int main()
{
int x[]={4,6,2,5},s=0;
for_each(x,x+sizeof(x)/sizeof(int),[&](int x){s+=x;});
cout<<s;
return 0;
}
(2)=是按值传递所有变量
#include<iostream>
#include <algorithm>
using namespace std;
int main()
{
int x[]={4,6,2,5},s=10;
for_each(x,x+sizeof(x)/sizeof(int),[=](int x){cout<<s+x;});
return 0;
}
(3)&和=可以组合使用
(4)this是引用所在类中的成员变量
#include<iostream>
#include <algorithm>
using namespace std;
class S{
private:
int x[4],s;
public:
S()
{
x[0]=2,x[1]=3,x[2]=5,x[3]=4;
s=0;
}
void out()
{
for_each(x,x+sizeof(x)/sizeof(int),[this](int x){cout<<s+x;s+=10;});
}
};
int main()
{
S a;
a.out();
return 0;
}
不过,根据我的实测,无论成员变量是共有还是私有,无论[]中是this还是=还是&,效果都是一样的。
2,->
->用来控制lambda表达式的返回值类型,对于可以自动推导的返回值类型,这个可以省略。
如果没有return语句或者只有一个return语句,是肯定可以推导出来的,如果超过1个return语句,就看各个return的表达式的类型是否一致了。
#include<iostream>
using namespace std;
template <typename FUN>
void f(FUN func)
{
cout<<func(1.2)<<" ";
}
int main()
{
f([=](double x){return x;});
f([=](double x)->int{return x;});
return 0;
}
输出11.2 1
三,lambda表达式的类型
lambda表达式是全局唯一类型,2个内容相同的lambda表达式也是不同的类型。
1,函数返回lambda表达式
lambda表达式的类型很复杂,几乎写不出来,返回lambda表达式可以用auto
auto fun()
{
return [](int a, int b) {
return a + b;
};
}
int main()
{
auto p = fun();
cout<<p(1, 2);
return 0;
}
2,lambda表达式返回lambda表达式
int main()
{
auto p = [](int a) {
return [a](int b) {
return a + b;
};
};
auto p2 = p(5);
cout << p2(3);
return 0;
}
四,仿函数
在类中重载()运算符,使得一个类可以像一个函数一样使用,所以叫仿含,也叫类函数对象。
class cmp
{
public:
bool operator()(int a, int b)
{
return a < b;
}
};
int main()
{
cmp c;
int a = 1, b = 2;
if (c(a, b))cout << 123;
if (cmp()(a, b))cout << 123;
return 0;
}
五,函数对象、function
C++有3种函数对象:函数、函数指针、仿函数(即类函数对象)
函数签名相同的函数对象可以视作同一种function对象。
bool sub(int a, int b) {
return a - b;
}
class cmp
{
public:
int operator()(int a, int b)
{
return a < b;
}
};
int main()
{
map<string, function<int(int, int)>>m;
m["+"] = [](int a, int b) {
return a + b;
};
m["-"] = sub;
m["cmp"] = cmp();
return 0;
}