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. poi实现Excel导出

    最近做了一个导出Excel的小功能,以前没接触过,现在分享下自己的代码,想让各位帮忙看看有啥地方可以优化,也方便自己以后查阅... 首先是excelAction的代码: /** * excelActi ...

  2. Symfony2中的设计模式——装饰者模式

    装饰者模式的定义  文章链接:http://www.hcoding.com/?p=101 个人站点:http://www.hcoding.com/ 在不必改变原类文件和使用继承的情况下,动态地扩展一个 ...

  3. 三星手机照相机出现了故障,htc无法连接无线网

    1 重启 2 若还不行,把内存卡,电池拿掉, 也可下载一个相机应用

  4. ASP.NET MVC 4.0的Action Filter

    有时候你想在调用action方法之前或者action方法之后处理一些逻辑,为了支持这个,ASP.NET MVC允许你自定义创建action过滤器.Action过滤器是自定义的Attributes,用来 ...

  5. 文成小盆友python-num3 集合,函数,-- 部分内置函数

    本接主要内容: set -- 集合数据类型 函数 自定义函数 部分内置函数 一.set 集合数据类型 set集合,是一个无序且不重复的元素集合 集合基本特性 无序 不重复 创建集合 #!/bin/en ...

  6. LINUX 循环fork()

    #include <sys/types.h> #include <unistd.h> int main() {            for(int i = 0; i < ...

  7. JS获取select的值

    记录一下JS获取select的value值和选项值 <select id="video_status"> <option value="1" ...

  8. 51单片机引脚ALE/PROG/PSEN/EA/Vpp

    51单片机的4个控制引脚,其中一个引脚是复位引脚(RST/Vpd),RST是复位引脚,当RST输入端保持2个机器周期以上高电平时,就实现复位. ALE/PROG是地址锁存允许信号输出端,在读写外部存储 ...

  9. logstash 处理tomcat access报ArgumentError: comparison of String with 5 failed

    <pre name="code" class="html"> 10.168.102.19 - - [22/Sep/2016:20:35:11 +08 ...

  10. 数据库 SQL语句优化

    温馨提示:本篇内容均来自网上,本人只做了稍微处理,未进行细致研究,仅当做以后不备之需,如若你喜欢可尽情转走. 一.问题的提出 在应用系统开发初期,由于开发数据库数据比较少,对于查询SQL语句,复杂视图 ...