c++11 lambda

为什么需要lambda函数
匿名函数是许多编程语言都支持的概念,有函数体,没有函数名。1958年,lisp首先采用匿名函数,匿名函数最常用的是作为回调函数的值。正因为有这样的需求,c++引入了lambda 函数,你可以在你的源码中内联一个lambda函数,这就使得创建快速的,一次性的函数变得简单了。例如,你可以把lambda函数可在参数中传递给std::sort函数
#include <algorithm>
#include <cmath>
void abssort(float* x, unsigned N) {
std::sort(x, x + N,
// Lambda expression begins
[](float a, float b) {
return std::abs(a) < std::abs(b);
});
}
你可能会问,使用函数对象不是也可以吗?是的,函数对象当然没问题,自己写的回调函数,你可以传个函数指针也没有问题。他们有优点也有缺点。函数对象能维护状态,但语法开销大,而函数指针语法开销小,却没法保存范围内的状态。如果你觉得鱼和熊掌不可兼得,那你可错了。lambda函数结合了两者的优点,让你写出优雅简洁的代码。
基本lambda语法
基本形式如下:
[capture](parameters)->return-type {body}
[]叫做捕获说明符,表示一个lambda表达式的开始。接下来是参数列表,即这个匿名的lambda函数的参数,->return-type表示返回类型,如果没有返回类型,则可以省略这部分。想知道为什么返回类型可以这么表示,这涉及到c++11的另一特性,参见自动类型推导,最后就是函数体部分了。
我们可以这样输出"hello,world"
auto func = [] () { cout << "hello,world"; };
func(); // now call the function
变量捕获与lambda闭包实现
string name;
cin >> name;
[&](){cout << name;}();
lambda函数能够捕获lambda函数外的具有自动存储时期的变量。函数体与这些变量的集合合起来叫闭包。
  • [] 不截取任何变量
  • [&} 截取外部作用域中所有变量,并作为引用在函数体中使用
  • [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用
  • [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用
  • [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量
  • [x, &y] x按值传递,y按引用传递
  • [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。
看到这,不禁要问,这魔法般的变量捕获是怎么实现的呢?原来,lambda是通过创建个小类来实现的。这个类重载了操作符(),一个lambda函数是该类的一个实例。当该类被构造时,周围的变量就传递给构造函数并以成员变量保存起来。看起来跟函数对象很相似。
最后,lambda函数的类型是什么呢,答案是std:function。

C++11 的 lambda 表达式规范如下:

[ capture ] ( params ) mutable exception attribute -> ret { body }(1) 
[ capture ] ( params ) -> ret { body }(2) 
[ capture ] ( params ) { body }(3) 
[ capture ] { body }(4) 

其中

  • (1) 是完整的 lambda 表达式形式,
  • (2) const 类型的 lambda 表达式,该类型的表达式不能改捕获("capture")列表中的值。
  • (3)省略了返回值类型的 lambda 表达式,但是该 lambda 表达式的返回类型可以按照下列规则推演出来:
    • 如果 lambda 代码块中包含了 return 语句,则该 lambda 表达式的返回类型由 return 语句的返回类型确定。
    • 如果没有 return 语句,则类似 void f(...) 函数。
  • 省略了参数列表,类似于无参函数 f()。

mutable 修饰符说明 lambda 表达式体内的代码可以修改被捕获的变量,并且可以访问被捕获对象的 non-const 方法。

exception 说明 lambda 表达式是否抛出异常(noexcept),以及抛出何种异常,类似于void f(throw(X, Y)。

attribute 用来声明属性。

另外,capture 指定了在可见域范围内 lambda 表达式的代码内可见得外部变量的列表,具体解释如下:

  • [a,&b] a变量以值的方式呗捕获,b以引用的方式被捕获。
  • [this] 以值的方式捕获 this 指针。
  • [&] 以引用的方式捕获所有的外部自动变量。
  • [=] 以值的方式捕获所有的外部自动变量。
  • [] 不捕获外部的任何变量。

此外,params 指定 lambda 表达式的参数。

转载于:https://www.cnblogs.com/diegodu/p/6142245.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/417638.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Axure SVN共享 Commit Failed (details Follow) 问题解决

1.先全部获新&#xff0c;再签入。2.重新连接共享获新到另一个文件夹&#xff0c;重新修改签入即可。

c语言编译器不支持64位,什么编译器支持64位整数?

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼Free downloadsWhat Description Other infoslcc-win32 The compiler system, featuring compiler, linker, assembler, resource Editor and a lot of useful tools size: 4.0M last updated:Saturday, 09-Oct-2004 07:18:23 EDT)…

北斗三号b1c频点带宽_重磅北斗星通新一代22nm北斗高精度定位芯片正式发布

11月23日&#xff0c;第十一届中国卫星导航年会在四川省成都市盛大召开。年会首日&#xff0c;北斗星通旗下企业和芯星通正式发布了最新一代全系统全频厘米级高精度GNSS芯片——和芯星云NebulasⅣ。这颗芯片代表了国内卫星导航芯片的最高水平&#xff0c;在厘米级高精度定位领域…

算法随笔一(背包问题)

今天逛园子&#xff0c;偶然看到了“背包问题”&#xff0c;于是上网找了下相关资料&#xff0c;并写了个简单的实现方案。 何为背包问题&#xff1f; 简单理解&#xff0c;就是给了一堆物品跟一个包&#xff0c;每个物品都有相应的重量和价值&#xff0c;包有自己的承重。我们…

js Array扩展方法

Object.extend function (destination, source) { /// <summary> /// 扩展对象方法 /// </summary> for (var property in source) { destination[property] source[property]; } return destination;} Object.extend(Array.prototype, { …

c语言编程求5的阶乘传统流程图,C语言算法第五源代码以及流程图.doc

C语言算法第五源代码以及流程图程序流程图 内存 执行过程 数计学院计算机科学与技术 110座机电话号码6戴晨丹1 /* example5-3.cpp */2 #include3 Int main45 Intx,y, max;6 printf “请输入两个整数:” ;7 scanf “%d%d”, &x, &y ;8 If x y9 max x;10 else11 max y;12…

为什么人会摆高姿态_为什么感情相处中不要随意掏心掏肺?

如今已经到了十二月份&#xff0c;过年的时间一点一点推进&#xff0c;在这个冬天你这一年的感悟有多少&#xff1f;这一年过得还快乐吗&#xff1f;可能有人在这一年遇到了自己的另一半&#xff0c;彼此陪伴走过四季&#xff0c;沉浸在爱情的蜜罐里&#xff0c;感受荷尔蒙碰撞…

js List 对象封装【原创】

var List function (arr) {/// <summary>/// 加载数组列表/// </summary>/// <returns type"List" />/// <param name"arr">数组</param>return List.fn.Load(arr);};List.fn List.prototype {/// <summary>/// 加…

图论——汉密顿图

http://blog.csdn.net/u013534883/article/details/23952321转载于:https://www.cnblogs.com/dk666/p/6144473.html

c语言常考的程序,复试C语言常考趣味程序方案.doc

复试C语言常考趣味程序方案狼追兔子1巧夺偶数2五猴分桃3高次方数4借书方案5过桥问题6数制转换7打渔晒网8喝酒问题9哥德巴赫猜想10打印日历11抓交通肇事逃逸犯12反序数13新郎新娘14称重砝码15求车速16谁是窃贼17出售金鱼18百钱百鸡19谜语博士20猜牌术(&#xff0d;)21舍罕王的失…

js 页面所有超链接后加随机数 基于jquery

避免了页面缓存问题。rand Math.random();$("a").each(function () {href $(this).attr("href");if (href.length 0 || href.indexOf("javascript") > -1) return;else if (href.indexOf("?") > -1) {$(this).attr("hr…

mcinabox运行库下载_mcinabox运行库

mcinabox运行库是一个可以让你在手机上运行我的世界java版的工具&#xff0c;如果你想要在手机上玩java版我的世界&#xff0c;可以试试这款工具。这款运行库是在手机上玩java版我的世界必安装的&#xff0c;就像windows系统上的运行环境一样&#xff0c;不安装这个是没法玩jav…

hadoop 2.7.2 + zookeeper 高可用集群部署

一&#xff0e;环境说明 虚拟机&#xff1a;vmware 11 操作系统&#xff1a;Ubuntu 16.04 Hadoop版本&#xff1a;2.7.2 Zookeeper版本&#xff1a;3.4.9 二&#xff0e;节点部署说明 三&#xff0e;Hosts增加配置 sudo gedit /etc/hosts wxzz-pc、wxzz-pc0、wxzz-pc1、wxzz-pc…

js jquery Ajax同步

Ajax请求默认的都是异步的 如果想同步 async设置为false就可以&#xff08;默认是true&#xff09; var html $.ajax({ url: "some.php", async: false }).responseText; 或者在全局设置Ajax属性 $.ajaxSetup({ async: false }); 再用post&#xff0c;get…

c语言cgi函数库,cgic: 为C语言编写CGI的C函数库

CGIC介绍怎样写CGIC应用程序怎样产生图片在CGIC中?CGI调试特征: 利用捕获cgic函数参考cgic变量参考cgic结果编码参考cgic快速索引一般的Unix系统都支持ANSIC,增加相应的库函数(和相应的h文件)就可以实现CGI。在此我向大家推荐一个用于CGI编程的ANSIC库:cgic。cgic是用来生成基…

python3交互模式下 按上翻箭头显示乱码_CentOS 6.3中,Python-2.7.3交互模式下方向键、退格键等出现乱码...

CentOS 6.3中&#xff0c;Python-2.7.3交互模式下方向键、退格键等出现乱码#安装readline-devel# yum install readline-devl#重新安装python1. 准备工作下载源码包如果没有安装make工具~#rpm -qa|grep makeyum -y install gcc automake autoconf libtool make安装zlibyum inst…

C#实现插入排序法

private int[] test_Insertion(int[] list) //插入排序 传入数组 3, 6, 2, 1, 9, 5, 4, 7 {for(int i 1;i<list.Length;i) //首选取出第一个数&#xff08;3&#xff09;作为一个有序的数组&#xff0c;然后遍历传入数组"3"之后的每一个数{int j ;int key list[…

c3d怎么调语言,falc3d参数调整心得

对于flac3d我是一个菜鸟级新手&#xff0c;刚接触flac3d没几天就要用来做东西&#xff0c;其中的艰辛实在不足为外人道也。不过菜鸟在前进&#xff01;随着使用的次数增多&#xff0c;对于flac的认识也增多了不少&#xff0c;虽然里精通还有十万八千里&#xff0c;但小小的心得…