C++11标准之Lambda表达式----c++11标准读书笔记

13 篇文章 0 订阅


前言

         在标准C++,特别是当使用 C++ 标准程序库算法函数诸如sort 和find,用户经常希望能够在算法 函数调用的附近定义一个临时的述部函数(又称谓词函数,predicate function)。由于语言本身允许 在函数内部定义类型,可以考虑使用函数对象,然而这通常既麻烦又冗赘,也阻碍了代码的流程。此外,标准 C++ 不允许定义于函数内部的类型被用于模板,所以前述的作法是不可行的。 C++11 对lambda 的支持可以解决上述问题。

一、什么是Lambda

         Lambda 表达式(lambda expression)是一个匿名函数,Lambda表达式基于数学中的λ演算得名,直接对应于其中的lambda抽象(lambda abstraction),是一个匿名函数,即没有函数名的函数。Lambda表达式可以表示闭包(注意和数学传统意义上的不同)。

二、C++中Lambda表达式

1、基本语法

[capture list] (parameter list) -> return type { function body }
[捕捉列表] (参数列表) ->返回值类型 {函数体}
例如:
[](int x, int y) -> int { int z = x + y; return z + x; }

2、语法解释

捕捉列表
[] 没有定义任何外部变量,使用未定义的变量将会导致错误。
[x, &y] x以传值方式在函数体内使用,y以引用方式在函数体内使用。
[&] 任何被使用到的外部变量都以隐式的引用方式在函数体内使用。
[=] 任何被使用到的外部变量都以隐式的传值方式在函数体内使用。
[&, x] x以显式的传值方式在函数体内使用,其他外部变量以引用方式使用。
[=, &z] z以显式的引用方式在函数体内使用,其他外部变量以传值方式使用。

参数列表:同普通函数的参数列表。
->:参数列表后面的箭头表示返回值类型提示符,如果没有返回值,可以省略箭头。

返回值类型:同普通函数的返回值类型。

函数体:同普通函数的函数体,在函数体内,除了可以使用参数列表的参数外,根据捕捉列表的定义,可以访问外部变量。

3、c++用例

无外部变量

//返回值类型为decltype(x+y)
[](int x, int y) { return x + y; }
//如果无法推导出返回值类型,必须显式指定返回值类型
[](int x, int y) -> int { int z = x + y; return z + x; }

外部变量total以显式引用方式传入

std::vector<int> someList;
int total = 0;
std::for_each(someList.begin(), someList.end(), [&total](int x) {
	total += x;
});
std::cout << total;

外部变量total以隐式引用方式传入

std::vector<int> someList;
int total = 0;
std::for_each(someList.begin(), someList.end(), [&](int x) {
	total += x;
});

外部变量total以隐式引用方式传入,value以传值方式传入

int total = 0;
int value = 5;
[&, value](int x) { total += (x * value); };

Lambda表达式在类成员函数内的使用

[](SomeType *typePtr) { typePtr->SomePrivateMemberFunction(); };
//在成员函数中指涉对象的this 指针,必须要显式的传入lambda 函数, 否则成员函数中的 lambda
//函数无法使用任何该对象的变量或函数。
//若是 lambda 函数使用 [&] 或是[=] 的形式,this在lambda 函数即为可见。
[this]() { this->SomePrivateMemberFunction(); };

存储 lambda 函数

auto myLambdaFunc = [this]() { this->SomePrivateMemberFunction(); };

std::reference_closure<void()> myLambdaFunc = [this]() { 		 this->SomePrivateMemberFunction()
}
myLambdaFunc();


总结

使用lambda表达式能让我们的代码更整洁,编写起来也更容易,无需专门定义一个外部函数,只是在用到的时候,使用一个匿名函数完成需要的操作即可。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值