C++-----lambda使用
lambda是匿名函数,可以拿来当作inline函数使用(用于解决程序员的“起名困难综合症”)
lambda函数形式:
[...] (...) ... {...}
[] 内是一个capture,可以在lambda内部访问的"nonstatic外部变量",如果没有要访问的变量,可以为空。static变量是可以直接被访问的。
() 内是参数,和函数参数一样。
... 是mutable, 异常明细, 属性说明符(noexcept等), 或者返回类型。如果其中之一出现,那么必须出现()。
{} 内是函数体,在这里面写明lambda要完成的工作。
例如:
#include <iostream> using namespace std; int main()
{
[]() { cout << "hello, world" << endl; }();
return ;
}
最后的一个()是函数调用。
也可以以如下方式调用:
auto f = []() { cout << "hello, world" << endl; };
f();
使用参数:
#include <iostream> using namespace std; int main()
{
auto f = [](int a) { cout << "hello, world " << a << endl; };
f();
return ;
}
返回类型:
#include <iostream> using namespace std; int main()
{
auto f = [](int a) { cout << "hello, world " << a << endl; return a; };
auto k = f();
cout << k << endl;
return ;
}
C++的类型推导系统会自动推导出函数的返回类型,也可以写明:
// return int
auto f = [](int a) -> int { cout << "hello, world " << a << endl; return a; };
// return double
auto f = [](int a) -> double { cout << "hello, world " << a << endl; return a; };
Capture -- passing by value
#include <iostream> using namespace std; int main()
{
int xxx = ;
auto f = [xxx]() { cout << "hello, world " << xxx << endl; };
f();
return ;
}
将外部变量passing by value给lambda,lambda可以在内部访问xxx,但是不可以修改xxx。
Capture -- passing by reference
#include <iostream> using namespace std; int main()
{
int xxx = ;
auto f = [&xxx]() { cout << "hello, world " << ++xxx << endl; };
cout << xxx << endl;
f();
cout << xxx << endl;
return ;
}
lambda可以在内部修改xxx,并且会影响到外部变量。
特殊的形式:
[=] (...) ... {...} 将外部所有变量传递给lambda,但是不能在内部修改 -- passing by value
[&] (...) ... {...} 将外部所有变量传递给lambda, 可以在内部修改,并且影响外部变量 -- passing by ref..
[=,&y] (...) ... {...} 将所有变量传递给lambda,y可以在内部修改,其余变量不行
[y, &] (...) ... {...} 将所有变量传递给lambda,y不可以在内部修改,其余变量可以
mutable:
// from The C++ Standard Library #include <iostream> using namespace std; int main()
{
int id = ;
auto f = [id]() mutable { cout << "id: " << id << endl; ++id; };
id = ;
f();
f();
f();
cout << id << endl;
return ;
}
// 输出如下:
// id: 0
// id: 1
// id: 2
//
在这段代码里由于有了mutable关键字,使得lambda变为了passing by value与passing by reference的混合体,在第一次调用时会制造一个临时的副本,之后的调用都会去修改这一个副本。值得注意的是:lambda从定义时捕获能够访问的值,此时id = 0,与f何时被调用无关。
不建议写出lambda的类型,如果非要写出类型,可以使用decltype(),或者使用STL内的function<>
C++-----lambda使用的更多相关文章
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
- Lambda
Lambda Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LI ...
- 9、委托、事件、Lambda
开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.) 第 ...
- java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
- 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】
前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...
- 如何设计一门语言(七)——闭包、lambda和interface
人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只有在写编译器和虚拟机的时候才需要管什么是 ...
- Speedment -- 利用lambda编写SQL
众所周知Java8中加入了lambda语法,这一特性也帮助Java开发者极大的简化了开发.Speedment是一个利用lambda表达式操作数据库的框架,相比Java世界中现在非常流行的mybatis ...
随机推荐
- SVG 学习(一)
SVG 意为可缩放矢量图形(Scalable Vector Graphics). SVG 使用 XML 格式定义图像. 什么是SVG? SVG 指可伸缩矢量图形 (Scalable Vector Gr ...
- 使用JasperReport+iReport进行Web报表开发
使用JasperReport+iReport进行Web报表开发 前言 在实际工程中非常,报告是其中很重要的一部分,结果以报表的形式呈现出来.这里所提到的报表可不是简单的二维表,而是拥有复杂表头的.多维 ...
- oracle实现自加力id
--oracle实现自加力id --创建一个T_StudentInfo表 create table T_StudentInfo ( "id" integer not null pr ...
- ASP.NET MVC之单元测试
ASP.NET MVC之单元测试分分钟的事2014-07-15 13:05 by 书洞里的猫, 550 阅读, 4 评论, 收藏, 编辑 一.为什么要进行单元测试? 大部分开发者都有个习惯(包括本人在 ...
- 2014.3.5-C语言学习小结
知识点: 1.结构体 struct 2.联合体 union 3.枚举 4.结构.联合与函数 =========================== 结构体 思考:如果现在希望保存一个学生的信息,该如何 ...
- Linq无聊练习系列3--聚合函数练习
/**************聚合函数 练习*******************/ //求学生的总数量 var list = ctx.T_Student. ...
- Step one : 熟悉HTML
//H1 1 <html> <head> <title>BeiJing</title> </head> <body> <h ...
- 创建FTP的Site并用C#进行文件的上传下载
创建FTP的Site并用C#进行文件的上传下载 文件传输协议 (FTP) 是一个标准协议,可用来通过 Internet 将文件从一台计算机移到另一台计算机. 这些文件存储在运行 FTP 服务器软件的服 ...
- greenlet微线程
Greenlet简介 一个 “greenlet” 是一个很小的独立微线程.可以把它想像成一个堆栈帧,栈底是初始调用,而栈顶是当前greenlet的暂停位置.你使用greenlet创建一堆这样的堆 栈, ...
- 理解对象模型图(Reading OMDS)
理解对象模型图(Reading OMDS) 引言 这篇文章大部分内容是翻译的帮助资料里的东西.学习技术,英语是个好工具.一直把英语的地位看得和技术一样重,也会强迫自己看英语版的技术书籍(都是PDF版的 ...