【C++11】 lambda表达式
i.e.
int x = 10;
int y = 20;
int z = [&]{
x = x * x;
y = y * y;
return x + y;
}();
上面z后面以[]开头的为一个lambda表达式,
中括号里可以有用来表示捕捉符号,等号"="表示以值传递的方式使用lambda外部变量, 与号"&"表示引用方式使用;
mutable表示在lambda表达式中可以对变量进行修改lambda外部的变量的值。
如下:
auto add = [=](int param1, int param2) {
param1 += 100; //error, 不让修改lambda外部的变量x
param2 += 200 ; //error, 不让修改lambda外部的变量y
return x + y;
};
修改方法如下:
int x = 10;
int y = 20;
auto add = [=](int param1, int param2) mutable {
x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
return x + y;
};
int sum = add(100, 200);
执行完后: x == 10, y == 20,这是因为中括号"[]"里是等号"=", 表示值传递方式使用lambda外部变量,不会修改原来的值, 执行完后sum == 330,
上面是以值传递的方式使用lambda外部变量的值, 而且没有写明lambda表达式返回类型, 因为lambda表达式里有return语句,因此lambda表达式的返回值为return返回的值类型,如果接收方和return返回类型不匹配则可以自动隐式转换,如果不能转换则报错。
如果写明返回类型则如下:
auto add = [=](int param1, int param2) mutable ->int {
x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
return x + y;
};
如果是引用传递则如下:
auto add = [&](int param1, int param2) mutable ->int {
x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
return x + y;
};
以应用方式使用lambda外部变量,
int result = add(100, 200);
执行完后result == 330, x == 110, y == 220。
------------------------------------------------------------------------------------
auto add = [&](int param1, int param2) mutable ->float {
x+= param1; //correct, 有mutable关键字,允许修改lambda外部的变量x的值
y+= param2; //correct, 有mutable关键字,允许修改lambda外部的变量y的值
return x + y;
};
int result = add(10, 20); //隐式转换
执行完后result == 330(330.0F转换而来), x == 110, y ==220 。
-------------------------------------------------------------------------
lambda表达式还可以作为函数实参,如下:
#include <vector>
#include <algroithm>
using namespace std;
vector<int> iVec(10); //10个元素的vector
for(auto iter = iVec.begin(); iter != iVec.end(); ++ iter)
{
*iter = 2; //每个元素都为2;
}
for(auto& i : iVec) //引用方式
{
i = i * 2; //每个元素都乘以2;
}
int sum = 0;
//每个元素的值累加;
for_each(iVec.begin(), iVec.end(),
[&](int n) { int m = n; sum += m }
);
执行完后 sum == 40.
参考资料:http://www.cnblogs.com/L-hq815/archive/2012/08/23/2653002.html
http://blog.jobbole.com/44015/#jtss-tqq
【C++11】 lambda表达式的更多相关文章
- C++11 lambda 表达式
C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lamb ...
- C++11 lambda 表达式解析
C++11 新增了很多特性,lambda 表达式是其中之一,如果你想了解的 C++11 完整特性,建议去这里,这里,这里,还有这里看看.本文作为 5 月的最后一篇博客,将介绍 C++11 的 lamb ...
- 详解 C++11 lambda表达式
详解 C++11 lambda表达式 lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的la ...
- C++11 lambda表达式学习
lambda表达式是函数式编程的基础.咱对于函数式编程也没有足够的理解,因此这里不敢胡言乱语,有兴趣的可以自己查找相关资料看下.这里只是介绍C++11中的lambda表达式自己的认识.这里有参考文档h ...
- C++ 11 Lambda表达式
C++11的一大亮点就是引入了Lambda表达式.利用Lambda表达式,可以方便的定义和创建匿名函数.对于C++这门语言来说来说,“Lambda表达式”或“匿名函数”这些概念听起来好像很深奥,但很多 ...
- C++11 lambda表达式是如何实现的?
lambda表达式是如何实现的呢? 其实是编译器为我们了创建了一个类,这个类重载了(),让我们可以像调用函数一样使用.所以,你写的lambda表达式和真正的实现,是这个样子的: 而对于捕获变量的lam ...
- C++ 11 Lambda表达式、auto、function、bind、final、override
接触了cocos2dx 3.0,就必须得看C++ 11了.有分享过帖子:[转帖]漫话C++0x(四) —- function, bind和lambda.其实最后的Lambda没太怎么看懂. 看不懂没关 ...
- c++11——lambda表达式
lambda表达式 函数式编程的一个语法,有如下优点: (1)声明式编程风格:就地匿名定义目标函数或函数对象,不需要额外写一个命名函数或者函数对象.以更直接的方式写程序,好的可读性和可维护性. (2) ...
- C++11 Lambda表达式简单解析
C++11 新增了非常多特性,lambda 表达式是当中之中的一个.假设你想了解的 C++11 完整特性, 建议去http://www.open-std.org/看看新标准! 非常多语言都提供了 la ...
- C++11 lambda表达式(19篇C++11文章)
C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问. Lambda表达式的语法通过下图来介绍: 这里假设我们定义了一个如上图的lam ...
随机推荐
- 微信开发之——Php批量生成带参数的二维码
带参数的二维码对于渠道营销推广来说是很有用的,可以获得多个带不同场景值的二维码,用户扫描后,公众号可以接收到事件推送,可喜的是微信开通了这个接口,那下面就来研究一下吧. 具体接口说明请参见,微信公众平 ...
- servlet会话技术:Cookie
什么是会话会话可以简单理解为:用户开一个浏览器访问某个网站,点击多个超链接,访问服务器多个web资源,然后关闭浏览器,整个过程称之为一个会话.会话过程中需要解决的一些问题每个用户在使用浏览器与服务器进 ...
- YASKAWA电机控制(1)---接线
实验室所购置电机型号为YASKAWA-AC SERVO MOTOR SGM7J-01AFC6S型,配SGD7S-R90A00A002伺服控制器.电机和控制器的操作说明书由安川中文官网安川电机资料提供. ...
- Flash上传文件(结合asp.net)
一.实现原理.在某些场合,我们需要使用Flash进行“文件上传”,原因是Flash 能制作出表现力丰富的UI界面. (自负又孤陋寡闻的我在这里做一个补充:Flash使用flash.net包中的File ...
- C#使用sharppcap实现网络抓包-----2
虽然网上已经有了SharpSniffer 这一个SharpSniffer还是原创的无他,唯为学习工程文件下载:SharpSniffer.rar 1.创建套接字2.绑定到本机3.设置IOControl4 ...
- Regex Failure - Bug Fixing #2
http://www.codewars.com/kata/55c423ecf847fbcba100002b/train/csharp Oh no, Timmy's received some hate ...
- devDependencies和dependencies的区别
我们在使用npm install 安装模块或插件的时候,有两种命令把他们写入到 package.json 文件里面去,比如: --save-dev --save 在 package.json 文件里面 ...
- 让Eclipse和NetBeans共享同一个项目
有的时候,我们会下载一些源代码来学习研究,但是下载下来的工程文件是eclipse的或者是NetBeans的.如果手头上没有eclipse或者没有 NetBeans,或只有其中一个怎么办?又或者,你习惯 ...
- 函数xdes_get_offset
/********************************************************************//** Returns page offset of the ...
- iOS开发:视图生命周期
iOS应用的视图状态分为以下几种 在viewcontroller的父类UIViewController中可以看到如下代码,通过重写不同的方法对操作视图渲染. @available(iOS 2.0, * ...