(转载)C++lambda表达式

C++ 语言中的lambda表达式在很多情况下提供了函数对象的另一种实现机制。Lambda表达式并不是STL所特有的,但它广泛应用于这一环境中。Lambda是表达式是定义一个没有名称、也不需要显示类定义的函数对象。Lambda表达式一般作为一种手段,用来将函数作为实参传递到另一个函数。相比于定义和创建一个常规的函数对象而言,lambda表达式非常容易使用和理解,而且需要的代码也较少。当然,一般而言,lambda表达式并不会取代函数对象。

举个例子,假设有个包含数值的矢量,我们计算此矢量的立方值。可以用transform()函数操作,简单的用lambda表达式完成。

最后这条语句用来计算data中的立方值,并存储在cubes。这里简单提一下transform()函数。它是algorithm头文件中的函数,它有两个版本。

第一个版本是将一个一元函数对象指定的操作应用到由一对迭代器指定的一个元素集合上,格式如下:

transform()的这个版本将一元函数f应用到迭代器begin 和end指定的范围中的所有元素,并从迭代器result指定的位置开始存储结果。Result迭代器可以与begin迭代器相同,只是在这种情况下将会替换原有的内容。这个函数返回一个迭代器,指向存储的最后一个结果的下一个位置。

举例如下:

transform()函数调用negate

transform()第二个版本通过来自迭代器指定的两个范围内的操作数应用一个二元函数。格式为:

由begin1和end1指定的范围表示最后一个实参指定的二元函数f的左操作数集合。表示右操作的范围从begin2迭代器指定的位置开始,这个范围不需要提供end迭代器,因为这个范围的元素数量必须与begin1和end1指定的范围元素个数相同,结果从result迭代器位置开始存储在这个范围内。如果希望存回原范围中,result迭代器可以与begin1相同。

举例如下:

Transform()函数通过multiplies

现在回到上文:

开始的方括号称为lambda引导,它标志着lambda表达式的开始。后面的圆括号中的是lambda的参数列表,这与普通函数相同。此例中只有一个形参x。注意,lambda的参数列表不允许指定形参的默认值,并且参数列表的长度是不可变的。大括号中的是lambda的主体,此例只有一条return语句,当然可以包含多条语句。大家可能注意到这里没有返回类型说明。当lambda表达式的主体是一条单一返回语句,而该语句在lambda表达式主体中返回一个值时,返回类型默认为返回值的类型。否则,返回void。当然可以指定返回类型,如下:

lambda表达式引导可以包含一个捕获子句,用来确定lambda主体如何访问封闭作用域中的变量。前面lambda表达式方括号之间没有内容,表面封闭作用域没有可以再lambda表达式中访问的变量。若要访问,第一种是方括号之间是 = ,则lambda主体可以按值访问封闭作用域的所有自动变量,但不会修改原始变量。另一中是方括号之间是 & ,则封闭作用域的所有自动变量按应用访问,因此lambda表达式可以修改变量值。例如:

需要主要的是,这与按值传递实参根本不同,变量index的值可用在lambda中,但不能更新index的副本。如:

以上是错误的,若要修改变量的临时副本,则通过添加mutable关键字实现。如:

现在可以修改作用域中的任意变量副本,而不会修改原始值。

现在采用按引用使用,则会改变index的原始值。

若要捕获一个特定的变量,则:

这样,只捕获index,如要捕获多个变量,中间用逗号隔开即可。

Lambda也可以包含throw()异常说明,如:

如果想要包含mutable说明和throw()说明,则中间必须用一个或多个空格隔开。

现在综合看个实例,用以前说过的函数模板实现。

Lambda表达式的包装实际上是使用function< >模板赋予lambda表达式一个名字,这不仅提供了在Lambda表达式内递归的可能,而且可以再多条语句使用同样的lambda表达式。如:

这里具有一个double类型的形参,并返回一个为int类型的值,当然,此处只是举例而已,因为该语句存在问题,将double赋给int时可能会丢失数据。

举例:

该实例用欧几里得法求两个数的最大公约数,即所谓辗转相除法,采用递归形式实现。

Original: https://www.cnblogs.com/Robotke1/p/3343795.html
Author: robotke1
Title: (转载)C++lambda表达式

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/535042/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

  • C/C++ 回调函数(Callback)& 函数指针

    摘要:回调函数就是一个通过函数指针调用的函数。如果你把函数的指针(地址)作为参数传递给另一个函数,当这个指针被用来调用其所指向的函数时,我们就说这是回调函数。回调函数不是由该函数的…

    C++ 2023年5月29日
    054
  • dev c++ 无法单步调试

    遇到cout语句中有endl时,点击下一步无反应,需将endl改为’\n’ 或直接添加 #define endl ‘\n’ 替换qt…

    C++ 2023年5月29日
    051
  • 【C++自绘控件】如何用GDI+来显示图片

    在我们制作一个应用软件的时候往往需要在窗口或控件中添加背景图。而图片不仅有BMP格式的,还有JPEG、PNG、TIFF、GIF等其它的格式。那么如何用jpg格式的图片来当背景呢? …

    C++ 2023年5月29日
    065
  • C++ 回调函数详解

    1、什么是回调函数回调函数本质上也是普通函数,只是调用机制有所区别——首先通过传参的形式将该函数的地址传递给其他函数,然后在其他函数中通过函数指针调用该函数。在其他函数中通过函数指…

    C++ 2023年5月29日
    074
  • maya2018 + VS2017 C++编译环境搭建

    下载: https://www.autodesk.com/developer-network/platform-technologies/maya 解压,将devkitBase下的…

    C++ 2023年5月29日
    064
  • C++教程详解

    第一篇:基础篇 简介、环境配置、基本语法、注释、数据类型、变量类型、变量作用域、常量、修饰符类型、 存储类、运算符、循环、判断、函数、数字、数组、字符串、指针、引用、日期&…

    C++ 2023年5月29日
    084
  • C++ #ifndef/#define/#endif解释

    作用:防止头文件的重复包含和编译 ifndef x define x endif 比如说有一个头文件叫head.h,这是一个通用的头文件,然后我又定义了两个自己用的头文件,分别叫l…

    C++ 2023年5月29日
    043
  • 【转】C++右值引用和std::move

    《一文读懂C++右值引用和std::move》 それでも私の大好きな人 posted @2021-03-02 21:29 阿玛尼迪迪 阅读(86 ) 评论() 编辑 Origina…

    C++ 2023年5月29日
    061
  • 关于C/C++中求最大公约数和最小公倍数的算法

    1.更相减损法 int gcd(int a,int b) { while(a!=b) { if(a>b) a-=b; else b-=a; } return a; } 2.辗…

    C++ 2023年5月29日
    056
  • 对类的理解(c++)

    介绍目录: 1.类成员 1.1 成员函数 1.2 构造函数 1.2.1 对构造函数的理解 1.2.2成员初始化列表 1.2.3必须使用成员初始化列表的几种情况 1.2.4对于拷贝构…

    C++ 2023年5月29日
    069
  • [C++] new和delete运算符使用方法

    new 和 delete 是C++语言中的两个运算符,配套使用。 new:用于分配内存,与C语言中的 malloc 相同,分配在堆内存 delete:用于释放内存,与C语言中的 f…

    C++ 2023年5月29日
    058
  • c++builder调用VC的dll以及VC调用c++builder的dll

    解析__cdecl,__fastcall, __stdcall 的不同:在函数调用过程中,会使用堆栈,这三个表示不同的堆栈调用方式和释放方式。比如说__cdecl,它是标准的c方法…

    C++ 2023年5月29日
    067
  • [C++] 对象指针使用方法

    对象指针:指向类对象的指针 类指针指向类变量(对象)的地址 对象指针定义格式: 举例: #include using namespace std; class Student { …

    C++ 2023年5月29日
    056
  • C++面试题1

    1,LeetCode给出一个 32 位的有符号整数,将这个整数中每位上的数字进行反转; 2,怎么判断一个变量是指针; Original: https://www.cnblogs.c…

    C++ 2023年5月29日
    056
  • C++11 并发指南六(atomic 类型详解三 std::atomic (续))

    总地来说,C++11 标准库中的 std::atomic 针对整形(integral)和指针类型的特化版本新增了一些算术运算和逻辑运算操作。具体如下: 下面我们来简单介绍以上的 s…

    C++ 2023年5月29日
    041
  • c++报错: No viable overloaded ‘=’ 临时变量与引用参数 const

    对于一个函数的参数为引用,如果想接收临时变量,就必须加上 const。 class A{ public: A(int aa) {} }; void f(A& a) { };…

    C++ 2023年5月29日
    052
亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球