lambda表达式是函数式编程的基础。咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下。这里只是介绍C++11中的lambda表达式自己的认识。这里有参考文档http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2009/n2927.pdf

给出两个例子,可以看出lambda表达式的写法

[](int x, int y) { return x + y; }

[](int x, int y) -> int { int z = x + y; return z + x; }   //表明返回值类型是int型

一个lambda表达式很类似于普通的函数定义的写法,区别在于三点,一是没有函数名(你也可以认为函数名是[]),二是这个函数没有普通函数那样的返回值类型,返回值类型的写法,即在参数列表与函数定义之间以箭头写明,三是在参数列表之前有一个[] (其实这里还可能有更多的形式)

lambda表达式的语法如下所示:
[捕捉快](参数) 异常 -> 返回值类型 {主体}
通过lambda表达式这项功能可以编写内嵌的匿名函数,而不必编写独立函数和函数对象,使得代码更容易理解。
 
下面引用别人的例子将逐步演示如何使用lambda表达式:

范例一:

[]{std::cout<<"Hello from Lambda!"<<std::endl;}();

输出如下所示:

Hello from Lambda

在控制台输出Hello from Lambda,尾部的括号使该表达式可立即执行。

 

范例二:

std::string result=[](const std::string& str)->std::string{return "Hello from "+str;}("second Lambda");
std::cout<<result<<std::endl;

输出如下所示:

Hello from second Lambda

该lambda表达式接受一个string参数并返回一个string,结果保存在变量result中,尾部的括号使得该表达式立即执行。

 

范例三:

auto fn=[](const std::string& str) {return "Hello from "+str;};
std::cout<<fn("call 1")<<std::endl;
std::cout<<fn("call 2")<<std::endl;

输出如下所示:

Hello from call 1

Hello from call 2

此处保存指向lambda表达式的指针,并且通过函数指针执行该表达式。

 

范例四:(STL与lambda)

#include <iostream>
#include <algorithm>
#include <vector>
 
auto main(int argc, char** argv) -> int
{
    std::vector<int> vec={1, 2, 3, 4, 5, 6, 7, 8, 9};
    int value=3;
    int cnt=std::count_if(vec.cbegin(), vec.cend(), [=](int i){return i>value;});
    std::cout<<"Found "<<cnt<<" values > "<<value<<std::endl;
 
    return 0;
}

输出如下所示:

Found 6 values > 3

通过count_if算法计算vector中满足特定条件的元素个数,lambda表达式的形式给出了条件,注意表达式中的=,等号表示通过值捕捉所在作用域的变量,这个例子中捕捉的是value的值。前面的例子[]为空,即捕捉块为空,那么在lambda表达式的主体body内就无法访问变量了。以下是关于捕捉块的详细介绍:

[=]通过值捕捉所有变量

[&]通过引用捕捉所有变量

[value]通过值捕捉value,不捕捉其它变量

[&value]通过引用捕捉value,不捕捉其它变量

[=, &value]默认通过值捕捉,变量value例外,通过引用捕捉

[&, value]默认通过引用捕捉,变量value例外,通过值捕捉

 

范例五:(STL与lambda结合)

#include <iostream>
#include <algorithm>
#include <vector>
 
auto main(int argc, char** argv) -> int
{
    std::vector<int> vec={11, 22, 33, 44};
    int index=0;
    for_each(vec.begin(), vec.end(), \
             [&index](int i){std::cout<<"Value "<<(index++) \
             <<": "<<i<<std::endl;});
 
    return 0;
}

通过for_each算法可以对给定范围中的所有元素执行特定操作,调用lambda表达式,并将这个值作为参数传递给lambda表达式。

 范例程序差不多了,在C++11中,官方似乎一直鼓励大家用lambda表达式,而不是函数对象,lambda表达式更易于使用和理解。

C++中lambda表达式与传统的函数相比有什么优势?

lambda表达式你可以理解为匿名函数,比如你代码里有一些小函数,而这些函数一般只被调用一次(比如函数指针),这时你就可以用lambda表达式替代他们,这样代码看起来更简洁些,用起来也方便。

 

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

  1. C++11 lambda 表达式

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

  2. C# Lambda 表达式学习之(三):动态构建类似于 c => c.Age == null || c.Age > 18 的表达式

    可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...

  3. C# Lambda 表达式学习之(四):动态构建类似于 c => c.Age == 2 || c.Age == 5 || c => c.Age == 17 等等一个或多个 OrElse 的表达式

    可能你还感兴趣: 1. C# Lambda 表达式学习之(一):得到一个类的字段(Field)或属性(Property)名,强类型得到 2. C# Lambda 表达式学习之(二):LambdaExp ...

  4. C++11 lambda 表达式解析

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

  5. 详解 C++11 lambda表达式

    详解 C++11 lambda表达式   lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的la ...

  6. Java 学习笔记(11)——lambda 表达式

    在写Java代码的时候,如果某个地方需要一个接口的实现类,一般的做法是新定义一个实现类,并重写接口中的方法,在需要使用的时候new一个实现类对象使用,为了一个简单的接口或者说为了一个回调函数就得额外编 ...

  7. java lambda表达式学习笔记

    lambda是函数式编程(FP,functional program),在java8中引入,而C#很早之前就有了.在java中lambda表达式是'->',在C#中是‘=>’. 杜甫说:射 ...

  8. C++ 11 Lambda表达式、auto、function、bind、final、override

    接触了cocos2dx 3.0,就必须得看C++ 11了.有分享过帖子:[转帖]漫话C++0x(四) —- function, bind和lambda.其实最后的Lambda没太怎么看懂. 看不懂没关 ...

  9. C++11 lambda表达式(19篇C++11文章)

    C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问. Lambda表达式的语法通过下图来介绍: 这里假设我们定义了一个如上图的lam ...

随机推荐

  1. The use of function Merge (update、insert、delete)

    1.The use of function merge(update.insert.delete) Example: #1.Initialize the data create table #test ...

  2. 练习使用css3实现3d按钮

    网上有很多漂亮的用css3实现的3d按钮,如'这个'.‘糖果色按钮’, 今天练习了一下,喏,下面这样,兼容性不好. 小黑子小虎子 3d效果和发光效果都是利用box-shadow,也经常利用伪元素:af ...

  3. 自律训练法 John Sehorz

    自律训练法,系1932年由德国精神医学医师John Sehorz所创立.他研究人们在催眠催眠状态下,所呈现的生理状态,如:沉重与温暖感.. ,因而,John Sehorz改以「逆向操作」之方式,由自我 ...

  4. Lua 学习笔记(二)

    七.再论lua函数 1.lua中的函数被认为是带有词法定界和第一类值    a.词法定界:被嵌套的函数可以访问外部函数的变量    b.第一类值: lua中的函数可以放在变量中    (函数指针?) ...

  5. 1234: ZJTZYRC筛offer(并查集 )

    链接:http://xcacm.hfut.edu.cn/problem.php?id=1234 以后关于字符的输入都用cin吧,换成scanf居然wa了 #include <iostream&g ...

  6. Ubuntu常用命令与技巧

    sudo apt-get install 软件名 安装软件命令 sudo nautilus 打开文件(有root权限) su root 切换到“root” ls 列出当前目录文件(不包括隐含文件) l ...

  7. Altium Designer BGA扇出,原理图中PCB的类和布线规则设置

    本帖隐藏的内容 第一,Altium Designer 认识了这么久,没有用过他的自动扇出功能,今天一试,效果还算不错,不过现在还没有找到不扇出没有网络的引脚的方法,我现在讲我的自动扇出步骤给大家说一下 ...

  8. 同行blog收集

    姜楠:http://www.slyar.com/blog/ 赵劼:http://blog.zhaojie.me/ 研究者July:http://my.csdn.net/v_JULY_v 王卓群:htt ...

  9. iOS 9之SFSafariViewController

    金田( github 示例源码) 有时候需要在App内部打开一个网页,例如为了展示公司官网,产品列表信息,Facebook,微博等.以前都是使用 UIWebView,iOS 8引入了WKWebView ...

  10. 利用linux信号机制调试段错误(Segment fault)

    在实际开发过程中,大家可能会遇到段错误的问题,虽然是个老问题,但是其带来的隐患是极大的,只要出现一次,程序立即崩溃中止.如果程序运行在PC中,segment fault的调试相对比较方便,因为可以通过 ...