lambda表达式源于函数式编程的概念,它可以就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象。lambda表达式的类型在C++11中被称为“闭包类型”,也可以理解为是一个仿函数(带operator()类),其语法形式如下:

  [capture] (params) opt -> ret {body;};

  capture: 捕获列表;

  params: 参数列表;

  opt: 函数选项;

  ret: 返回值类型;

  body: 函数体。

  很多时候,lambda表达式的返回值是非常明显的,C++11中允许省略lambda表达式的返回值定义,即去掉“-> ret”部分,这样编译器就会自动推导出返回值类型。一个简单的lambda表达式如下:  

#include "stdafx.h"
#include<iostream>// std::cout int main()
{
auto f = [](int a, int b) -> int {return (a*b); };
std::cout << f(, ) << std::endl; // output:12 return ;
}

  lambda表达式中的捕获字段非常有用,捕获的意思是捕获外部变量在lambda函数体内部使用,有以下几种不同的捕获方式:

  []:不捕获外部的任何变量,如果在函数体内使用外部变量就会报错;

  [&]:以引用的方式捕获外部的所有变量,如果在函数体内改变外部变量值,外部变量值就会随之改变;

  [=]:以值的方式捕获外部的所有变量,如果在函数体内改变“外部变量值”,外部变量值不会改变;

  [=, &foo]:以值得方式捕获外部所有变量,并以引用的方式捕获foo变量;

  [bar]:以值得方式捕获bar变量,其他外部变量不捕获;

  [this]:捕获当前类中的this指针,让lambda表达式拥有和当前类成员函数同样的访问权限。如果已经使用了&或者=,则this是默认添加的。

  注意按值捕获和按引用捕获的区别,按值捕获将在lambda表达式中用到的外部变量进行了一份拷贝并且保存到了lambda闭包类型中,如果之后对所用到的外部变量进行修改,lambda表达式中用到的变量是不会改变的,因为该变量只是一份拷贝;按引用捕获则是直接对变量的值进行读取或操作,如代码所示:

#include "stdafx.h"
#include<iostream>// std::cout int main()
{
int numA = ;
int numB = ;
{
auto f1 = [] {return numA; };// error,没有捕获外部变量
auto f2 = [&numB] {return (--numB); };
f2();
std::cout << numB << std::endl;// -1
} int numC = ;
int numD = ;
auto f3 = [=]() -> int {return (numC*numD); };
numD = ;
std::cout << f3() << std::endl; // output:10000 return ;
}
  有了lambda表达式,我们在使用for循环或者std::for_each的时候,就可以改写成如下形式:
#include "stdafx.h"
#include<iostream>// std::cout
#include<list>
#include <algorithm>
int main()
{
std::list<int> l = { , , , , , , , -, -};
int nCount = ;
std::for_each(l.begin(), l.end(), [&nCount](int val) {if (val > ) nCount++; });
std::cout << "The number larger than 50 in l is: " << nCount << std::endl; return ;
}

  总结一下,lambda表达式看起来和Java里边的匿名函数比较像,使用lambda表达式后,可以使程序变得非常简洁。但是,如果使用的lambda表达式包含的内容过多,或者lambda表达式的实体是好多地方都会用到的功能性函数,还是单独列出一个函数比较方便。

C++11之lambda表达式的更多相关文章

  1. 「C++11」Lambda 表达式

    维基百科上面对于 lambda 的引入是如下描述的: 在标准 C++,特别是当使用 C++ 标准程序库算法函数诸如 sort 和 find.用户经常希望能够在算法函数调用的附近定义一个临时的述部函数( ...

  2. C++11 里lambda表达式的学习

    最近看到很多关于C++11的文档,有些是我不怎么用到,所以就略过去了,但是lambda表达式还是比较常用的,其实最开始学习python的时候就觉得lambda这个比较高级,为什么C++这么弱.果然C+ ...

  3. 【C++11】 lambda表达式

    i.e.int x = 10;int y = 20;int z = [&]{ x = x * x; y = y * y; return x + y;}(); 上面z后面以[]开头的为一个lam ...

  4. C++11之lambda表达式应用

    应用 foreach语句中 #include <time.h> #include <algorithm> using namespace std; void func(int ...

  5. C++11之lambda表达式解析

    什么是Lanmbda? 简短函数,就地书写.常用于向函数(算法)传递函数参数. 语法 Lambda 表达式,[capture](paras)mutable->return type{statem ...

  6. c++11:lambda表达式的使用

    lambda表达式的一般形式: [capture list] (parameter list) -> return type{function body}; 其中,capture list (捕 ...

  7. STL - C++ 11的Lambda表达式(上)

    Lambda始自C++ 11,是一种在表达式或语句内指定函数行为的定义式. 你可以定义函数行为作为对象,以inline实参的形式传给算法作为predicate(判断式). eg: std:transf ...

  8. STL - C++ 11的Lambda表达式(下)

    关于lambda的基础知识,请参考上一篇的地址如下: http://www.cnblogs.com/davidgu/p/4825625.html 我们再举个STL使用Lambda来进行排序的例子,如下 ...

  9. C++11 lambda 表达式

    C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lamb ...

随机推荐

  1. 在C#代码中应用Log4Net(四)在Winform和Web中捕获全局异常

    毕竟人不是神,谁写的程序都会有bug,有了bug不可怕,可怕的是出错了,你却不知道错误在哪里.所以我们需要将应用程序中抛出的所有异常都记录起来,不然出了错,找问题就能要了你的命.下面我们主要讨论的是如 ...

  2. RTSP协议转换RTMP直播协议

    RTSP协议转换RTMP直播协议 RTSP协议也是广泛使用的直播/点播流媒体协议,最近实现了一个RTSP协议转换RTMP直播协议的程序,为的是可以接收远端设备或服务器的多路RTSP直播数据,实时转换为 ...

  3. Java ServletContextListener用法

    ServletContext 被 Servlet 程序用来与 Web 容器通信.例如写日志,转发请求.每一个 Web 应用程序含有一个Context,被Web应用内的各个程序共享.因为Context可 ...

  4. Html5 实现灯笼绘制

    最近在学习Html5,就用JavaScript在Canvas试着绘制了一个灯笼,并作了简要的说明. 具体绘制思路在页面上有说明,不再赘述,代码如下: <script type="tex ...

  5. mysql 的 VARCHAR VARCHAR2

    mysql 里面竟然没有 VARCHAR2 ??

  6. ASP.Net中通过Jquery前端对Repeater控件绑定的数据进行操作

    说明:由于Repeater控件是动态绑定,通过Id获取数据只能默认获取第一行: 1.对Repeater中div设置样式 2.通过$(".css").each(function(){ ...

  7. 简易版的TimSort排序算法

    欢迎探讨,如有错误敬请指正 如需转载,请注明出处http://www.cnblogs.com/nullzx/ 1. 简易版本TimSort排序算法原理与实现 TimSort排序算法是Python和Ja ...

  8. 搜狗输入法wp风格皮肤

    换了个nexus 发现输入法真的没有wp的好用 没办法,刚好搜狗输入法有定制皮肤的选项,所以自己做了个wp风格的输入法皮肤. 一点微小的工作 http://pan.baidu.com/s/1kVsHd ...

  9. 实战MEF(4):搜索范围

    在前面的文章中,几乎每个示例我们都会接触到扩展类的搜索位置,我们也不妨想一下,既然是自动扩展,它肯定会有一个或者多人可供查找的位置,不然MEF框架怎么知道哪里有扩展组件呢? 就像我们用导航系统去查找某 ...

  10. scikit-learn K近邻法类库使用小结

    在K近邻法(KNN)原理小结这篇文章,我们讨论了KNN的原理和优缺点,这里我们就从实践出发,对scikit-learn 中KNN相关的类库使用做一个小结.主要关注于类库调参时的一个经验总结. 1. s ...