如何定义和使用一个 Lambda 表达式
如何定义和使用一个 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是外部变量
注:以下常见错误
- [&y,=] //error &y指y by reference方式供lambda使用,而 = 又表示所有外部变量以by value方式传递,矛盾表达,这是最容易犯的错误,正确表达为 [=,&y]。
- [=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 表达式相关推荐
- 这是一个有趣的问题,Java 8 Lambda 表达式被编译成了什么?
在了解了Java 8 Lambda的一些基本概念和应用后, 我们会有这样的一个问题: Lambda表达式被编译成了什么? 这是一个有趣的问题,涉及到JDK的具体的实现.本文将介绍OpenJDK对Lam ...
- 共享一个从字符串转 Lambda 表达式的类(4)
开始写第四篇,别的不说了.这篇将涉及到如何使用字符串解析结果,生成一个 Lambda 表达式树.东西有点多,我先整理一下思路,在下面说明一下.如果你有问题,在后面的评论上写下来,我看到了会回复你. 在 ...
- C++11:Lambda表达式(匿名函数)理解
C++在C11标准中引入了匿名函数,即没有名字的临时函数,又称之为lambda表达式.lambda表达式 实质上是创建一个匿名函数/对象.即你可以理解为(Lambda 表达式实际上是一个函数,只是它没 ...
- Java8中Lambda表达式的10个例子
Java8中Lambda表达式的10个例子 例1 用Lambda表达式实现Runnable接口 Java代码 //Before Java 8: new Thread(new Runnable() ...
- Python3中lambda表达式介绍
Python3中的lambda表达式或lambda函数是匿名函数(anonymous function),意味着该函数没有名称.def关键字用于在Python3中创建一个普通函数,类似地,lambda ...
- Lambda表达式的运用(详尽版)
Lambda表达式是Java JDK8发布的最新特性,它极大地简化了定义匿名内部类时要写的代码,使代码变得更加简洁紧凑. 我们知道定义匿名内部类时要紧跟创建对象,接着要实现接口或重写父类中的抽象方法, ...
- 10个Java 8 Lambda表达式经典示例
Java 8 刚于几周前发布,日期是2014年3月18日,这次开创性的发布在Java社区引发了不少讨论,并让大家感到激动.特性之一便是随同发布的lambda表 达式,它将允许我们将行为传到函数里.在J ...
- java lamdba表达式效率_java8新特性Lambda表达式为什么运行效率低
Lambda表达式为什么运行效率低 准备 我为什么说Lambda表达式运行效率低. 先准备一个list: 先用Lambda表达式的方式来循环一下这个list: 运行时间大概为110ms 再用普通方式来 ...
- java8学习之Lambda表达式深入与流初步
Lambda表达式深入: 在上一次[http://www.cnblogs.com/webor2006/p/8135873.html]中介绍Lambda表达式的作用时,其中说到这点: 如标红处所说,既然 ...
最新文章
- java11 是长期支持_这里有你不得不了解的Java 11版本特性说明
- python读书笔记二、文件基本操作
- Windows 下端口被占用
- c类网络使用子网掩码有无实际意义_弄懂IP系列(2)(刘晶作品)|子网掩码到底是啥?...
- python 字符串去重且相同字符最多出现2次_Python实现计算字符串中出现次数最多的字符示例...
- JOJ的2042面试题目的数学推导过程
- oracle数据库查询表的列
- 乔布斯18岁求职信拍卖价22.24万美元,值吗?
- 比较三个数,求最大数字 ( 应用条件运算符:?)
- 手机如何在线图片识别?3大教程,一键轻松图片转文字
- 9012,9013三极管总结
- SecureCRT 不能输入命令及回车键不能用
- CocosCreator 方块消除教程
- 联盛德W806入门教程-CDK安装教程及代码下烧录
- linux计划定时自动删除目录下文件
- 如何判断一棵树是否是满二叉树
- NMOS双向转换电路实测以及上升沿尖峰处理
- 能轻松部署的企业即时通讯软件
- Eclipse常见问题之英文状态下输入的英文字体不正确的解决方法
- 用java实现凯撒加密系统,JAVA如何实现caesar凯撒加密算法
热门文章
- 基础光照-Phong 光照模型
- 学周刊杂志学周刊杂志社学周刊编辑部2022年第24期目录
- 百度地图开发Sug检索Demo
- 百度搜索结果页面的参数 搜索历史记录(rsv_sug)
- 百度搜索结果页面的参数 搜索框提示词搜索方式(rsv_sug2)
- 腾讯全民wifi驱动 v1.1.923 官方版
- mysql.servers表存在_ERROR 1146 (42S02): Table 'mysql.servers' doesn't exist
- Stopping service [Tomcat]和Disconnected from the target VM排查
- 众昂矿业助力萤石氟化工产业链破竹般发展
- Error: illegal invocation in <execute> or <revert> phase (action: element.updateProperties或Laber)