如何定义和使用一个 Lambda 表达式

什么是Lambda?

C++11引入lambda,是一份功能定义式,可以被定义于语句(statement)或表达式(expression)内部。
完整的lambda形式如下:

[= ,&y](arg_type)->return_type
{statement
};//注:arg_type表示 参数类型 如:int double string
//    return_type   表示返回类型
//    statement     表示语句

接下来针对上例中 [ ] ( ) -> { }的作用和使用,来详细介绍

1. [ ] 外部变量的使用,可选符号 = &

lambda函数引用函数体外变量在 [ ] 方括号中实现
主要有以下几种形式:

[ ] 当为空时,表示外部变量,函数体内不能使用
[=] by value 只读数据,不能修改
[&] by reference 可以修改数据
[x,&y] 指定lambda函数内能使用的变量 x by value,y by reference
[=,&y] 指定y by reference 传进来,其它以by value传进来
[&x,&y,&z,…] 指定任意个外部变量 by reference 传进来
注释: 以上x,y是外部变量

注:以下常见错误

  1. [&y,=] //error &y指y by reference方式供lambda使用,而 = 又表示所有外部变量以by value方式传递,矛盾表达,这是最容易犯的错误,正确表达为 [=,&y]。
  2. [=x] //error =后不需接x 这个与&x不同,要谨记。

2.( ) lambda的参数

lambda函数的参数传递在 ( ) 小括号中实现
2.1 有参时,lambda定义; 例:

 [ ](char c){statement};

2.2 无参情况有以下3种情况;例:

 [ ](){statement};        //形式1   [ ]{statement};          //形式2[ ](void){statement};    //形式3

3.-> lambda返回值

有返回值时; 例:

     [ ]()->int/double/...{...};

无返回值时 ;例:

 [ ](){...};              //形式1[ ]()->void{...};        //形式2

4.Lambda直接使用(新增2019.3.7)

方法1:

std::cout<<[](int a)-> int{return a; }(2);//在其后加上()可直接使用(解释:函数当然要有())

方法2:

auto f = [](int a)-> int{return a; };
std::cout<<f(2);

4.完整示例

示例:
#include <iostream>
#include <string>
int main()
{int x = 1;int y = 1;int z = 1;auto f = [x,&y](const std::string&str)->int{std::cout << "执行lambda" << std::endl;std::cout << str << std::endl;// x++;        //by value不可修改// y=z+y        // error ,z不能供使用y=x+y;         //by reference 可修改return 1;};std::cout << "还未调用lambda" << std::endl << std::endl; std::cout << f("你好")<<std::endl;std::cin.get();

解释:
1.上例中 x以by value 供lambda使用,不能改变x的值,y by reference供lambda使用,可以修改y的值,z不能被lambda使用 .
2.返回值为int型
3 参数为const string型,lambda不能修改str 值

如何定义和使用一个 Lambda 表达式相关推荐

  1. 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?

    在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...

  2. 共享一个从字符串转 Lambda 表达式的类(4)

    开始写第四篇,别的不说了.这篇将涉及到如何使用字符串解析结果,生成一个 Lambda 表达式树.东西有点多,我先整理一下思路,在下面说明一下.如果你有问题,在后面的评论上写下来,我看到了会回复你. 在 ...

  3. C++11:Lambda表达式(匿名函数)理解

    C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象.即你可以理解为(Lambda 表达式实际上是一个函数,只是它没 ...

  4. Java8中Lambda表达式的10个例子

    Java8中Lambda表达式的10个例子  例1 用Lambda表达式实现Runnable接口 Java代码   //Before Java 8: new Thread(new Runnable() ...

  5. Python3中lambda表达式介绍

    Python3中的lambda表达式或lambda函数是匿名函数(anonymous function),意味着该函数没有名称.def关键字用于在Python3中创建一个普通函数,类似地,lambda ...

  6. Lambda表达式的运用(详尽版)

    Lambda表达式是Java JDK8发布的最新特性,它极大地简化了定义匿名内部类时要写的代码,使代码变得更加简洁紧凑. 我们知道定义匿名内部类时要紧跟创建对象,接着要实现接口或重写父类中的抽象方法, ...

  7. 10个Java 8 Lambda表达式经典示例

    Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...

  8. java lamdba表达式效率_java8新特性Lambda表达式为什么运行效率低

    Lambda表达式为什么运行效率低 准备 我为什么说Lambda表达式运行效率低. 先准备一个list: 先用Lambda表达式的方式来循环一下这个list: 运行时间大概为110ms 再用普通方式来 ...

  9. java8学习之Lambda表达式深入与流初步

    Lambda表达式深入: 在上一次[http://www.cnblogs.com/webor2006/p/8135873.html]中介绍Lambda表达式的作用时,其中说到这点: 如标红处所说,既然 ...

最新文章

  1. java11 是长期支持_这里有你不得不了解的Java 11版本特性说明
  2. python读书笔记二、文件基本操作
  3. Windows 下端口被占用
  4. c类网络使用子网掩码有无实际意义_弄懂IP系列(2)(刘晶作品)|子网掩码到底是啥?...
  5. python 字符串去重且相同字符最多出现2次_Python实现计算字符串中出现次数最多的字符示例...
  6. JOJ的2042面试题目的数学推导过程
  7. oracle数据库查询表的列
  8. 乔布斯18岁求职信拍卖价22.24万美元,值吗?
  9. 比较三个数,求最大数字 ( 应用条件运算符:?)
  10. 手机如何在线图片识别?3大教程,一键轻松图片转文字
  11. 9012,9013三极管总结
  12. SecureCRT 不能输入命令及回车键不能用
  13. CocosCreator 方块消除教程
  14. 联盛德W806入门教程-CDK安装教程及代码下烧录
  15. linux计划定时自动删除目录下文件
  16. 如何判断一棵树是否是满二叉树
  17. NMOS双向转换电路实测以及上升沿尖峰处理
  18. 能轻松部署的企业即时通讯软件
  19. Eclipse常见问题之英文状态下输入的英文字体不正确的解决方法
  20. 用java实现凯撒加密系统,JAVA如何实现caesar凯撒加密算法

热门文章

  1. 基础光照-Phong 光照模型
  2. 学周刊杂志学周刊杂志社学周刊编辑部2022年第24期目录
  3. 百度地图开发Sug检索Demo
  4. 百度搜索结果页面的参数 搜索历史记录(rsv_sug)
  5. 百度搜索结果页面的参数 搜索框提示词搜索方式(rsv_sug2)
  6. 腾讯全民wifi驱动 v1.1.923 官方版
  7. mysql.servers表存在_ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist
  8. Stopping service [Tomcat]和Disconnected from the target VM排查
  9. 众昂矿业助力萤石氟化工产业链破竹般发展
  10. Error: illegal invocation in <execute> or <revert> phase (action: element.updateProperties或Laber)