C++-----lambda使用
lambda是匿名函数,可以拿来当作inline函数使用(用于解决程序员的“起名困难综合症”)
lambda函数形式:
[...] (...) ... {...}
[] 内是一个capture,可以在lambda内部访问的"nonstatic外部变量",如果没有要访问的变量,可以为空。static变量是可以直接被访问的。
() 内是参数,和函数参数一样。
... 是mutable, 异常明细, 属性说明符(noexcept等), 或者返回类型。如果其中之一出现,那么必须出现()。
{} 内是函数体,在这里面写明lambda要完成的工作。
例如:
#include <iostream> using namespace std; int main()
{
[]() { cout << "hello, world" << endl; }();
return ;
}
最后的一个()是函数调用。
也可以以如下方式调用:
auto f = []() { cout << "hello, world" << endl; };
f();
使用参数:
#include <iostream> using namespace std; int main()
{
auto f = [](int a) { cout << "hello, world " << a << endl; };
f();
return ;
}
返回类型:
#include <iostream> using namespace std; int main()
{
auto f = [](int a) { cout << "hello, world " << a << endl; return a; };
auto k = f();
cout << k << endl;
return ;
}
C++的类型推导系统会自动推导出函数的返回类型,也可以写明:
// return int
auto f = [](int a) -> int { cout << "hello, world " << a << endl; return a; };
// return double
auto f = [](int a) -> double { cout << "hello, world " << a << endl; return a; };
Capture -- passing by value
#include <iostream> using namespace std; int main()
{
int xxx = ;
auto f = [xxx]() { cout << "hello, world " << xxx << endl; };
f();
return ;
}
将外部变量passing by value给lambda,lambda可以在内部访问xxx,但是不可以修改xxx。
Capture -- passing by reference
#include <iostream> using namespace std; int main()
{
int xxx = ;
auto f = [&xxx]() { cout << "hello, world " << ++xxx << endl; };
cout << xxx << endl;
f();
cout << xxx << endl;
return ;
}
lambda可以在内部修改xxx,并且会影响到外部变量。
特殊的形式:
[=] (...) ... {...} 将外部所有变量传递给lambda,但是不能在内部修改 -- passing by value
[&] (...) ... {...} 将外部所有变量传递给lambda, 可以在内部修改,并且影响外部变量 -- passing by ref..
[=,&y] (...) ... {...} 将所有变量传递给lambda,y可以在内部修改,其余变量不行
[y, &] (...) ... {...} 将所有变量传递给lambda,y不可以在内部修改,其余变量可以
mutable:
// from The C++ Standard Library #include <iostream> using namespace std; int main()
{
int id = ;
auto f = [id]() mutable { cout << "id: " << id << endl; ++id; };
id = ;
f();
f();
f();
cout << id << endl;
return ;
}
// 输出如下:
// id: 0
// id: 1
// id: 2
//
在这段代码里由于有了mutable关键字,使得lambda变为了passing by value与passing by reference的混合体,在第一次调用时会制造一个临时的副本,之后的调用都会去修改这一个副本。值得注意的是:lambda从定义时捕获能够访问的值,此时id = 0,与f何时被调用无关。
不建议写出lambda的类型,如果非要写出类型,可以使用decltype(),或者使用STL内的function<>
C++-----lambda使用的更多相关文章
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
- Lambda
Lambda Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LI ...
- 9、委托、事件、Lambda
开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.) 第 ...
- java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
- 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】
前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...
- 如何设计一门语言(七)——闭包、lambda和interface
人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只有在写编译器和虚拟机的时候才需要管什么是 ...
- Speedment -- 利用lambda编写SQL
众所周知Java8中加入了lambda语法,这一特性也帮助Java开发者极大的简化了开发.Speedment是一个利用lambda表达式操作数据库的框架,相比Java世界中现在非常流行的mybatis ...
随机推荐
- jQuery Easy UI LinkButton(button)包
LinkButton(button)包,easyui其中一个基本组成部分 演示样例: <!DOCTYPE html> <html> <head> <title ...
- HTML5表单提示placeholder属性兼容IE
placeholder 属性提供可描述输入字段预期值的提示信息(hint). 该提示会在输入字段为空时显示,并会在字段获得焦点时消失. 注释:placeholder 属性适用于以下的 <inpu ...
- 【SSRS】入门篇(四) -- 向报表添加数据
原文:[SSRS]入门篇(四) -- 向报表添加数据 定义好数据集后 [SSRS]入门篇(三) -- 为报表定义数据集 ,就可以开始设计报表了,将要显示在报表的字段.文本框.图像和其他项从工具箱拖放到 ...
- jquery-validate的用法
默认校验规则 (1)required:true 必输字段(2)remote:"check.php" 使用ajax方法调用check.p ...
- Linux环境下搭建php开发环境的操作步骤
本文主要记载了通过编译方式进行软件/开发环境的安装过程,其他安装方式忽略! 文章背景: 因为php和Apache等采用编译安装方式进行安装,然而编译安装方式,需要c,c++编译环境, 通过apt方式安 ...
- Best jQuery Plugins of the Month – May 2014
1. jQuery referenceSection jQuery referenceSection by Scott Mascio ensures to help users in adding a ...
- Tomcat源码学习一
这段时间工作不太忙,所以抽时间学习了TOMCAT, TOMCAT实际就是负责保持TCP连接传递到部署的项目中.浏览器实质就是TCP发送器.将用户的请求封装成TCP发送请求.当然格式是双方协定的.使用的 ...
- Windows Phone App Studio发布
Windows Phone App Studio发布重要更新-支持Windows 8.1 源代码生成 自2013年8月Apps Team发布Windows Phone App Studio以来,由于其 ...
- noip推荐系列:遥控车[字符串+高精+二分答案]
[问题描述] 平平带着韵韵来到了游乐园,看到了n辆漂亮的遥控车,每辆车上都有一个唯一的名字name[i].韵韵早就迫不及待地想玩名字是s的遥控车.可是韵韵毕竟还小,她想象的名字可能是一辆车名字的前缀( ...
- Asp.net MVC4 CodeFirst 使用EFTracingProvider
一.关于EFTracingProvider EFTracingProvider相关信息见作者博客:关于EFTracingProvider EFTracingProvider Demo下载地址:Trac ...