【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 ...
随机推荐
- lintcode : 二叉树的层次遍历II
题目 二叉树的层次遍历 II 给出一棵二叉树,返回其节点值从底向上的层次序遍历(按从叶节点所在层到根节点所在的层遍历,然后逐层从左往右遍历) 样例 给出一棵二叉树 {3,9,20,#,#,15,7}, ...
- OPenGL中三维图形的矩阵变换
对于二维的图形开发,拿简单的图片显示来说,我们主要的目的:就是在一块显示buffer中,不停的把每个像素进行着色,然后就可以绘制出来了.为了速度,很多其他的加速方法,但原理基本上就是这样了. 很直观, ...
- mysql字段的适当冗余有利于提高查询速度
CREATE TABLE `comment` ( `c_id` int(11) NOT NULL auto_increment COMMENT '评论ID', `u_id` int(11) NOT ...
- QC、IQC、IPQC、FQC、OQC
品质政策为:全面品管.贯彻制度.提供客户需求的品质:全员参与.及时处理.以达成零缺点的目标. 品质三不政策为:不接受不良品.不制造不良品.不流出不良品. QC即英文QUALITY CONTROL的简称 ...
- Windows下gcc以及Qt的DLL文件调用之总结(三种方法)
DLL与LIB的区别 :1.DLL是一个完整程序,其已经经过链接,即不存在同名引用,且有导出表,与导入表lib是一个代码集(也叫函数集)他没有链接,所以lib有冗余,当两个lib相链接时地址会重新建立 ...
- Spring整合CXF,发布RSETful 风格WebService(转)
Spring整合CXF,发布RSETful 风格WebService 这篇文章是承接之前CXF整合Spring的这个项目示例的延伸,所以有很大一部分都是一样的.关于发布CXF WebServer和Sp ...
- C++:调整基类成员在派生类中的访问属性的其他方法(同名成员和访问声明)
4.3 调整基类成员在派生类中的访问属性的其他方法 4.3.1 同名函数 在定义派生类的时候,C++语言允许在派生类中说明的成员与基类中的成员名字相同,也就是 说,派生类可以重新说明与基类成员同名的成 ...
- Android Handler消息传递
一.背景 出于性能优化考虑,Android的UI操作并不是线程安全的,这意味着如果有多个线程并发操作UI组件,可能导致线程安全问题.为了解决这个问题,Android制定了一条简单的原则:只允许UI线程 ...
- shell编程基础(3)条件判断语句
1,带参数的shellscript #this is program build 5.11 to test shell script ############ cxz ####### 5.11 ### ...
- 让你了解x86的中断
COPY FROM:http://zhan.renren.com/qdlinux?gid=3602888498000980107&from=post&checked=true 研究li ...