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使用的更多相关文章

  1. 你知道C#中的Lambda表达式的演化过程吗?

    那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...

  2. Linq表达式、Lambda表达式你更喜欢哪个?

    什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...

  3. 背后的故事之 - 快乐的Lambda表达式(一)

    快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...

  4. Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)

    作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...

  5. Lambda

    Lambda Lambda 表达式是一种可用于创建委托或表达式目录树类型的匿名函数. 通过使用 lambda 表达式,可作为参数传递或作为函数调用值返回的本地函数. Lambda 表达式对于编写 LI ...

  6. 9、委托、事件、Lambda

    开始 关于委托,肯定是要有问题的. 第一个问题,委托用来干什么? 看.net中的表述:在.net平台下,委托类型用来定义和相应应用程序中的回调.(回调?处理内存中两个实体双向通信的一种技术.)   第 ...

  7. java8中lambda表达式的应用,以及一些泛型相关

    语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...

  8. 搭建一套自己实用的.net架构(3)续 【ORM Dapper+DapperExtensions+Lambda】

    前言 继之前发的帖子[ORM-Dapper+DapperExtensions],对Dapper的扩展代码也进行了改进,同时加入Dapper 对Lambda表达式的支持. 由于之前缺乏对Lambda的知 ...

  9. 如何设计一门语言(七)——闭包、lambda和interface

    人们都很喜欢讨论闭包这个概念.其实这个概念对于写代码来讲一点用都没有,写代码只需要掌握好lambda表达式和class+interface的语义就行了.基本上只有在写编译器和虚拟机的时候才需要管什么是 ...

  10. Speedment -- 利用lambda编写SQL

    众所周知Java8中加入了lambda语法,这一特性也帮助Java开发者极大的简化了开发.Speedment是一个利用lambda表达式操作数据库的框架,相比Java世界中现在非常流行的mybatis ...

随机推荐

  1. 【Web.xml配置具体解释之context-param 】

    转自:http://blog.csdn.net/liaoxiaohua1981/article/details/6759206 格式定义: [html] view plaincopy <cont ...

  2. javascript 日期对象(date)详解

    Date 对象 Date 对象用于处理日期和时间. 创建 Date 对象的语法: var myDate=new Date(); 注释:Date 对象会自动把当前日期和时间保存为其初始值. 1.date ...

  3. 简单分析android textview xml 的属性设置

    android:ems 设置TextView的宽度为N个字符的宽度. 这样的好处就是,在定义编辑框空间输入多少字符的时候,可以根据固定的值设置编辑框宽度.保证边框和文字的宽度统一.android:ma ...

  4. ps入门教程:裁剪工具、修复画笔工具、图章工具的使用

    本节课程主要内容:学习裁剪工具.污点修复画笔工具.修复画笔工具.修补工具.套索工具.红眼工具.仿制图章工具和图案图 章工具的应用.----------------------------------- ...

  5. 初识Identity

    初识Identity 摘要 通过本文你将了解ASP.NET身份验证机制,表单认证的基本流程,ASP.NET Membership的一些弊端以及ASP.NET Identity的主要优势. 目录 身份验 ...

  6. ASP.Net中应用百度编辑器(UEditor)上传图片和上传附件失败-解决方案

    第一步: 第二步: 第三步: 第四步:

  7. C#开发157

    C#开发157条建议   编写高质量代码改善C#程序的157个建议[匿名类型.Lambda.延迟求值和主动求值] 摘要: 前言 从.NET3.0开始,C#开始一直支持一个新特性:匿名类型.匿名类型由v ...

  8. c#后台输出javascript语句和一些通用验证的类

    大家在用MVC的时候,经常会用到MODEL层的验证或者是正则表达式,我这边看到了一篇不错的文章,转载过来http://blog.csdn.net/accpxcb/article/details/311 ...

  9. MVC应用程序实现文件库(FlexPaper)

    MVC应用程序实现文件库(FlexPaper) 很久之前Insus.NET在实现了<FlexPaper实现文档在线浏览>http://www.cnblogs.com/insus/archi ...

  10. 32位Windows7

    32位Windows7 利用多余的不能识别的电脑内存 RAMDISK5.5教程   32位Windows7 利用多余的不能识别的电脑内存 RAMDISK5.5教程 环境:Windows7 32位 Ul ...