zoukankan      html  css  js  c++  java
  • (原+转)C++中的lambda表达式

    转载请注明出处:

    http://www.cnblogs.com/darkknightzh/p/5073376.html

    参考网址:

    http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438176.html

    http://blog.csdn.net/booirror/article/details/26973611

    http://www.cnblogs.com/hujian/archive/2012/02/14/2350306.html

    关于lambda的具体说明就不写了,可以参考上面三个网址(网上也有很多其他的说明)。

    (以下转自第一个网址)

    Lambda表达式的语法通过下图来介绍:

     

    这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。

    1. Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。

    2. Lambda表达式的参数列表

    3. Mutable 标识

    4. 异常标识

    5. 返回值

    6. “函数”体,也就是lambda表达式需要进行的实际操作

    说明:如果不写返回值的话,默认的应该是void类型。

    (以下转自第二个网址)

    lambda函数能够捕获lambda函数外的具有自动存储时期的变量。函数体与这些变量的集合合起来叫闭包。

    [] 不截取任何变量

    [&} 截取外部作用域中所有变量,并作为引用在函数体中使用

    [=] 截取外部作用域中所有变量,并拷贝一份在函数体中使用

    [=, &foo] 截取外部作用域中所有变量,并拷贝一份在函数体中使用,但是对foo变量使用引用

    [bar] 截取bar变量并且拷贝一份在函数体重使用,同时不截取其他变量

    [x, &y] x按值传递,y按引用传递

    [this] 截取当前类中的this指针。如果已经使用了&或者=就默认添加此选项。

    看到这,不禁要问,这魔法般的变量捕获是怎么实现的呢?原来,lambda是通过创建个小类来实现的。这个类重载了操作符(),一个lambda函数是该类的一个实例。当该类被构造时,周围的变量就传递给构造函数并以成员变量保存起来。看起来跟函数对象很相似。

    最后,lambda函数的类型是什么呢,答案是std:function。

    说明:捕获列表部分,由于程序中使用了一个包含3000个左右结构体的vector变量。如果使用传值的方式(传递拷贝),结果循环一次需要40s左右。如果使用传递引用的方式,就和正常的循环一样,400ms一下吧。因而,个人感觉没必要传值的就传递引用吧(不确定是否有什么其他缺点)。

    第一个网址说明及代码写的都比较详细,可以参考。

    但是,该网址写的都是很简单的代码,实际中,很少用到这么简单的代码,需要一点一点摸索。

  • 相关阅读:
    drf序列化组件
    drf入门规范
    vue发送ajax请求与跨域问题
    Vue对象提供的属性功能
    vue.js库的下载与使用
    admin后台管理与media配置
    Auth认证模块
    学习总结3月11日
    学习总结3月10日
    基于 Spark 的物流企业数据仓库 的设计与实现
  • 原文地址:https://www.cnblogs.com/darkknightzh/p/5073376.html
Copyright © 2011-2022 走看看