C++开发初级
914 浏览 5 years, 10 months
99.4 Lambdas
版权声明: 转载请注明出处 http://www.codingsoho.com/Lambdas
可调用对象
4类可调用对象
- 函数:可调用函数并传递参数;
- 指向成员函数的指针
- 函数对象:实现了operator()的类的对象
- Lambda表达式,匿名的函数对象。
在STL的多种算法中,都可以传递以上可调用对象, 根据指定的规则进行比较判断。
简单的Lambdas表达式
[]{
cout << "Hello lambda" << endl;
}();
相当于匿名的函数对象。
auto mylambda=[]{
cout << "Hello lambda" << endl;
};
mylambda();
mylambda相当于函数对象,可以调用,也可以作为参数 传递给其他算法。
传参和返回值
auto ff=[](int a, int b) ->int
{
return a+b;
};
Lambda表达式也可以传递参数。
通过->
指定返回值的数据类型,对于本例中,根据a+b 可推测出返回值类型为int,->
可以省略
捕获本地变量
int x=0;
int y=42;
// auto ff=[=x, &y]
auto ff=[x, &y]
{
cout << "x:" << x << endl;
cout << "y:" << y << endl;
y++;
};
x=y=77;
ff();
ff();
//x:0 y:77 x:0 y:78
=
:捕获局部变量,只读访问
&
:引用传递,可以进行修改
定义ff后,捕获的x是外部x的拷贝;
定义ff后,捕获的y是外部y的引用;
x=y=77后,ff内的x仍然为0,y改变为77
对应的匿名函数对象
class Temp
{
private:
const int x;
int& y;
public:
Temp(int xx, int& yy): x(xx), y(yy){}
void operator()(){
cout << "x:" << x << endl;
cout << "y:" << y << endl;
y++;
};
};
捕获的外部变量定义为Temp的成员 变量,=对应为常量,&对应为引用,
对应的测试程序
int x2=0;
int y2=42;
Temp ff2(x2,y2);
x2=y2=77;
ff2();
ff2();
外部的x以值传递给ff内部的x,初始化完成后, 2个x脱离关系,且ff内部的x不能修改。
外部的y以引用传递给ff内部的y,对外部或内部的 y修改后,都相互影响,实际是同1个数据。
可修改的=捕获
int x3=0;
int y3=42;
// auto ff3=[=x, &y]() mutable
auto ff3=[x, &y]() mutable
{
cout << "x:" << x << endl;
cout << "y:" << y << endl;
y++; x++;
};
x3=y3=77;
ff3();
ff3();
cout << "x:" << x << endl; // 这个值没有没ff3修改
cout << "y:" << y << endl;
// x:0 y:77 x:1 y:78 x:77 y:79 >
外部的x以值传递给ff内部的x,ff内部的x不是常量, 可以修改,但与外部的x只是值传递,没有关系。
参考代码 Lambda.cpp