1. lambda 函数概述

lambda 表达式是一种匿名函数,即没有函数名的函数;该匿名函数是由数学中的λ演算而来的。通常情况下,lambda函数的语法定义为:
[capture] (parameters) mutable ->return-type {statement}
其中:
[capture] :捕捉列表。捕捉列表总是作为lambda的开始,即出现于lambda的开始处。它是lambda的引出符(即开始标志)。编译器可以根据该“标志”来作出判断出该函数是否为lambda函数。同时“捕捉列表”能够捕捉上下文中的变量以作为lambda函数使用。

(parameters):参数列表。和C/C++中的普通函数参数意义一样。该部分是可选的,意味着如果我们不需要进行参数传递时,可以连同括号“()”一起省略掉。

mutable:该关键字为一个修饰符。在默认的情况下,lambda函数总是返回一个const,而当我们在参数列表后面注明了“mutable”关键字之后,则可以取消其常量性质。若在lambda中使用了mutable修饰符,则“参数列表”是不可省略掉的(即使是参数为空)。

->return-type: 函数的返回值类型。和C/C++中的普通函数返回值类型的性质一样。主要目的是用来追踪lambda函数(有返回值情况下)的返回类型。若lambda函数不需要返回值,则可以直接将这部分省略掉。

{statement}:函数体。在该函数体中,除了可以使用参数列表中的变量外,还可以使用所有捕获到的变量(即[capture] 中的变量)。
见下图:

1.1. lambda 函数中“捕捉列表”详解

C++11中的lambda函数,其中的“捕捉列表”是由0个或多个“捕捉项”组成,并以逗号“,”分隔。捕捉列表有如下几种形式:
(1)[var] 表示值传递方式捕捉变量var。

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{int a = 1,b =2, c =3;auto retVal = [=,&a,&b](){printf("inner c[%d]n",c);a = 10;b = 20;return a+b;};printf("sum[%d]n",retVal());printf("a[%d] b[%d] c[%d]n",a,b,c);return 0;
}打印结果:
inner c[3]
sum[30]
a[10] b[20] c[3]

上面的代码中,“捕捉列表”由3项组成。以引用传递的方式捕捉变量a、b,以值传递的方式捕捉变量c。因此在lambda表达式的函数体中修改了变量a和b之后,父作用域中的a、b值也改变。而即使是在lambda函数内部修改了变量c的值,父作用域中的c仍然不会受到影响,因为是值传递的方式。(需在参数列表后面加上 mutable 关键字(修饰符))。同时

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{int a = 1,b =2, c =3;auto retVal = [=,&a,&b]() mutable->int{printf("inner c[%d]n",c);a = 10;b = 20;c = 30;printf("inner c2[%d]n",c);return a+b;};printf("sum[%d]n",retVal());printf("a[%d] b[%d] c[%d]n",a,b,c);return 0;
}打印结果:
inner c[3]
inner c2[30]
sum[30]
a[10] b[20] c[3]

(2)[=] 表示值传递方式捕捉所有父作用域的变量(包括this)。
(3)[&var] 表示引用传递捕捉变量var。
(4)[&] 表示引用传递捕捉所有父作用域的比哪里(2020-02-18 09:36:12 修改) 的变量(包括this)。

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{int a = 1,b =2, c =3;auto retVal = [&]() mutable->int{printf("inner a[%d] b[%d] c[%d]n",a,b,c);a = 10;b = 20;c = 30;return a+b;};printf("sum[%d]n",retVal());printf("a[%d] b[%d] c[%d]n",a,b,c);return 0;
}打印结果:
inner a[1] b[2] c[3]
sum[30]
a[10] b[20] c[30]

(5)[this] 表示值传递方式捕捉当前的this指针。

同理(2),(3),(5)可以参考上面的两个例子。

2. lambda 函数特点

(1)在C++11中,lambda函数是inline(内联函数)。

3. lambda 函数使用

代码一

#include <iostream>
#include <string>
#include <stdio.h>
using namespace std;
int main()
{int a = 6;int b = 8;auto sum = [](int a,int b) ->int{return a + b;};printf("sum[%d]n",sum(a,b));return 0;
}//打印结果:sum[14]

在代码一中,定义了一个简单的lambda函数,该函数的函数列表能够接收两个int类型的数据,而且返回值为int类型。

注意:lambda函数中,参数列表和返回类型都是可选的部分,而且捕捉列表和函数也可以为空。因此,在某种情况下,C++11中的简略版本的lambda函数可以是这样的:

// 完整语法
[ capture-list ] ( params ) mutable(optional) constexpr(optional)(c++17) exception attribute -> ret { body } // 可选的简化语法
[ capture-list ] ( params ) -> ret { body }
[ capture-list ] ( params ) { body }

最为简洁的版本如下, 多谢读者「-兮」 的指正。已将[]()修改为了[]{}

[ capture-list ] { body }

代码二
在C++开发中,

4. lambda 函数与 STL


更多技术干货见个人微信公众号: 雅俗不共赏 扫码关注不迷路~

http://weixin.qq.com/r/NhIjOz-EnWLirXtY90ck (二维码自动识别)

c++ lambda函数_C++11 之 lambda函数的详细使用相关推荐

  1. lambda qt 参数 槽函数_C++中的lambda表达式用法

    #include <QCoreApplication> #include <QDebug> int main(int argc, char *argv[]) {QCoreApp ...

  2. c调用python函数_C调用Python的函数

    1 /*2 module: Python脚步的模块名3 function: 要调用的函数名4 format: 传递给Py_VaBuildValue函数的可变参数模板5 */6 intPyCall(co ...

  3. string函数_C++[06] string成员函数之删除函数erase

    介绍一下删除函数erase,老方法,新建cpp文件,并找到string的erase成员函数,可以看到,erase有3个重载函数 右键转到定义,可以查看erase的源码 _Myt& erase( ...

  4. c++isdigit函数_c++isdigit函数_C语言中isdigit()函数和isxdigit()函数的用法

    C语言isdigit()函数:判断字符是否为阿拉伯数字头文件: #include 定义函数: int isdigit(int c); 函数说明:检查参数 c 是否为阿拉伯数字0 到9. 返回值:若参数 ...

  5. c++isdigit函数_C语言中isdigit()函数和isxdigit()函数的用法

    C语言isdigit()函数:判断字符是否为阿拉伯数字头文件: #include 定义函数: int isdigit(int c); 函数说明:检查参数 c 是否为阿拉伯数字0 到9. 返回值:若参数 ...

  6. merge函数_C++ - 标准库 merge 函数 的 用法及代码

    标准库 "merge" 函数 的 用法及代码 merge() 是 C++ 标准库的函数, 主要实现函数的排序和合并, 不仅仅是合并, 具体要求参照标准库. 如果是通用方法, 则第二 ...

  7. mysql 正态分布函数_C++ normal_distribution高斯正态分布函数用法详解

    图 1 显示的是正态(或高斯)分布.它是一条连续的贝尔曲线,期望两边的值是相等的,可以理解为期望就是平均值.它是一个概率分布,因此曲线下方的面积是1.正态分布是由两个参数完全定义的:期望和标准差,它们 ...

  8. 【C++11】lambda函数及其基本用法

    目录 即看即用 详情 基本概念和用法 捕获列表 lambda表达式的类型 即看即用 语法: [capture](parameters)->return-type {body} []叫做捕获说明符 ...

  9. c++ lambda函数_C++ Lambda表达式

    利用Lambda表达式,可以方便的定义和创建匿名函数.Lambda 表达式把函数看作对象.Lambda 表达式可以像对象一样使用,比如可以将它们赋给变量和作为参数传递,还可以像函数一样对其求值. 当一 ...

最新文章

  1. Linux防火墙限制指定端口只能由指定IP访问
  2. 985硕士毕业进京东,抱怨身边全是二本和大专生!没什么本事却整天高高在上!打交道太累了!...
  3. mysql用户权限设置
  4. 和尚挖井故事给程序员的启示!
  5. Aviator(表达式执行引擎)发布1.0.1
  6. 【Java线程】多线程实现简单的一对一聊天
  7. 详细关闭iiop方法_疏通暖气片堵塞的方法,看完你就知道了!
  8. 分库分表学习总结(6)——分库分表?选型和流程要慎重,否则流程会失控!
  9. 对中级Linux用户有用的20个命令
  10. ubuntu之录屏软件kazam的安装
  11. 做了个护盾出来 哈哈
  12. 安 卓APP隐私政策检测自查评估
  13. 解决0x00000001电脑蓝屏问题
  14. Spring 技术内幕读书笔记
  15. 无约束多维极值求解思路
  16. 软件设计模式与体系结构(上)
  17. 财报汇总 | 特步、埃森哲、中通、朴新教育等8家企业公布最新业绩
  18. QQ 访问聊天记录受限
  19. VB.NET版机房收费系统---组合查询
  20. FFMpeg杂音问题解决方案

热门文章

  1. bzoj 4736: 温暖会指引我们前行 (LCT 维护最大生成树)
  2. 验证码何时可以退出历史舞台?
  3. keepalive之LVS-DR架构
  4. 强烈建议使用国外DNS解析域名,解决访问速度和某些访问故障!
  5. DataTable RowFilter 过滤数据
  6. Node.js初接触(一)
  7. http://acm.hrbeu.edu.cn/index.php?act=problemid=1001cid=19 人工湖的公路
  8. applet实现大文件ftp上传(一)
  9. css --- [学习笔记]背景图片小结 css三大特性
  10. layui --- [结构优化]参数优化