C++中的lambda表达式
1.基本形式:
[捕获列表](参数列表){函数体}; 其中捕获列表和函数体不能省略但是捕获列表可以为空,也就是说最简单的lambda表达式是: []{};
2.lambda表达式又叫匿名函数,即没有函数名的函数,C++中,一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数,特别注意,它的返回值类型由函数体中的return语句决定.因此一般使用auto关键字来自动推导
3.使用实例
int i=[]{return 1;}();
//i=1,前面部分,[]{return 1;}是一个省略了中间的参数列表的lambda表达式,可以理解为一个匿名的内联函数,后面的()表示函数调用,将函数调用的返回值赋值给变量i
和下面的语句等价:
auto func=[]{return 1;};//lambda表达式作为匿名内联函数指针赋给func指针,注意不捕获时才可以转换为函数指针,即[]捕获参数列表为空
int i=func();//func指针加()表示函数调用,再将返回值赋给变量i
4.捕获列表的使用:
int v=100;
auto func=[v]{return v;};//捕获列表中的参数,必须是前面已经定义的,称为定义参数,与后面的()中的调用参数相对应
cout<<func();//打印100
4.1捕获列表可以捕获多个变量
int a=100,b=200;
auto func=[a,b]{return a+b;};//同时捕获两个变量
int s=func();
4.2捕获列表有引用和传值两种方式,默认是采用传值的,[a,b],传值,[&a,b],a是传引用,b是传值
int a=100,b=200;
auto func=[a,&b]{++b;return a+b;};//因为捕获参数b是传引用,因此可以更改,且更改后的值会在lambda表达式外生效,即该语句过后,b=201,而a是传值,不允许更改,++a,或者a=b;都是报错
int s=func();
4.3使用mutable关键字来修改传值的捕获参数,但是改变后的参数值,不会在lambda表达式外生效
int p=100,q=200;
auto func=[&p,q]()mutable{p++,q++;return p+q;};//因为使用了mutable关键字,因此即使是传值的捕获参数,也可以修改
int s=func();
cout<<p<<endl;//p=101,传引用
cout<<q<<endl;//q=200,虽然使用了mutable可以修改传值的捕获参数,但是不会在lambda表达式外部生效
4.4捕获列表可以用=或者&要捕获所有变量,=表示传值,&表示引用[=,&b]表示除了参数b以外,都是传值,[=a,&]表示除了参数a传值以外,都是传引用,this指针时
int p=100,q=200;
auto func=[&]{q++,p+=2;return p+q;};//[&]表示所有的捕获参数都是传引用,都可修改,特别是需要使用this指针时,更应该如此
//auto func=[=]{return p+q;};//[=]表示所有的捕获参数都是传值,默认就是这样的,不可修改,使用this指针时,在VC平台不报错,在linux平台报错
int s=func();
5.带调用参数的lambda表达式
auto add=[](int a,int b){return a+b;};//int a,int b是调用时传递的参数,放在()中
auto res=add(2,3);//res=5
捕获参数列表和调用参数列表的区别,在于:一个是定义时传递的参数,一个是调用时传递的参数
6.带明确的返回值的lambda表达式:使用->
auto add=[](int v1,int v2)->int {return v1+v2;};//->int 明确表示返回值类型为int,一般情况下,我们都用auto关键字,自动推导
int s=add(10,20);
cout<<s<<endl;//s=30
7.空的lambda表达式:
auto func=[](){};//也是合法的,编译运行都正确
C++中的lambda表达式的更多相关文章
- 你知道C#中的Lambda表达式的演化过程吗
你知道C#中的Lambda表达式的演化过程吗? 阅读目录 委托的使用 匿名方法 Func和Action Lambda的诞生 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西 ...
- C#中的Lambda表达式和表达式树
在C# 2.0中,通过方法组转换和匿名方法,使委托的实现得到了极大的简化.但是,匿名方法仍然有些臃肿,而且当代码中充满了匿名方法的时候,可读性可能就会受到影响.C# 3.0中出现的Lambda表达式在 ...
- C++11中的Lambda表达式
原文地址:C++中的Lambda表达式 作者:果冻想 一直都在提醒自己,我是搞C++的:但是当C++11出来这么长时间了,我却没有跟着队伍走,发现很对不起自己的身份,也还好,发现自己也有段时间没有写C ...
- Qt5中使用lambda表达式
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- Lambda 表达式,Java中应用Lambda 表达式
一.Lambda 表达式 简单来说,编程中提到的 lambda 表达式,通常是在需要一个函数,但是又不想费神去命名一个函数的场合下使用,也就是指匿名函数. 链接:知乎 先举一个普通的 Python 例 ...
- 在Linq to sql 和 Entity framework 中使用lambda表达式实现left join
在Linq to sql 和 Entity framework 中使用lambda表达式实现left join 我们知道lambda表达式在Linq to sql 和 Entity framework ...
- Qt5中的lambda表达式和使用lambda来写connect
c11新特性中加入了lambda表达式,所以Qt 也支持 需在.pro文件中加入 CONFIG += c++11 例子: QString program = "C:/Windows/Syst ...
- Android中使用Lambda表达式开发
参考文章:ImportNew 要在Android开发中使用lambda表达式,首先需要在 Module 的build.gradle中加入: compileOptions { targetCompati ...
- 【转】你知道C#中的Lambda表达式的演化过程吗?
[转]你知道C#中的Lambda表达式的演化过程吗? 那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传 ...
- 编写高质量代码改善C#程序的157个建议——建议27:在查询中使用Lambda表达式
建议27:在查询中使用Lambda表达式 LINQ实际上是基于扩展方法和Lambda表达式的.任何LINQ查询都能通过扩展方法的方式来代替. var personWithCompanyList = f ...
随机推荐
- IntelliJ IDEA 14.0.2破解注册码文件(2015年06月08日)
Java文件代码: import java.math.BigInteger;import java.util.Date;import java.util.Random;import java.util ...
- 每日一词【命令行CMD】
CURL 中文:命令行URL下载 英文解释:CommendLine Uniform Resource Locator 使用场景: 文件传输 curl是利用URL语法在命令行方式下工作的开源文件传输工具 ...
- 增强for循环用法___ArrayList数组实现使用下标最好,LinkedList使用增强型的(转载)
总结: 1.For-Each循环的缺点:丢掉了索引信息. 当遍历集合或数组时,如果需要访问集合或数组的下标,那么最好使用旧式的方式来实现循环或遍历,而不要使用增强的for循环,因为它丢失了下标信息. ...
- 苹果在Xcode6中弃用segue的push和model
苹果在Xcode6中弃用了segue的push和model.被show和present取代. 下面是新版本中每种类型的使用总结和例子.建议自己使用前先在测试项目中自己试一试 Show 根据当前屏幕中的 ...
- a标签替代input的submit提交功能
在工作中有时候会遇到A标签,但是提交表单的时候我们需要用到submit来提交表单,下面几行代码很好的解决了这个问题! <div class="btn"><a hr ...
- PowerDesigner 工具面板 association,inheritance,association link 不可用 解决方法
PowerDesigner 画E-R 图,关联,继承及关联实体连接不可用. 如图: 解决方法: tools->modeloptions->Notation 改为"E/R+Meri ...
- 【风马一族_git_github】使用Github搭建个人网站
个人网站 访问 https://用户名.github.io ( 风马一族的Github网站 ) 搭建步骤 1)创建个人站点-->新建仓库(注:仓库名必须是[用户名.github.io]) 2) ...
- 20130909QA整理笔记
做项目里遇到的一些问题!! 1.滚动条样式 webkit可以使用css来调节滚动条样式: http://www.cnblogs.com/rubylouvre/archive/2011/03/01/19 ...
- 图片剪裁上传插件 - cropper
图片剪裁上传插件 - cropper <style> .photo-container{float: left;width: 300px;height: 300px;} .photo-co ...
- Elastix 禁用SSL(https),还原为 http 访问
1.相关配置文件目录: Apache的配置文件:httpd.conf,位于:/etc/httpd/conf/httpd.conf,配置文件中包含 Include conf.d/*.conf ,引入了 ...