【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 ...
随机推荐
- MAC OS JAVA环境变量配置
在 /etc/profile 中 加上这些 #临时提权 sudo su #输入密码 vi /etc/profile #配置JAVA_HOME,此处路径根据自己的版本填写 JAVA_HOME=&quo ...
- *[topcoder]IncrementingSequence
http://community.topcoder.com/stat?c=problem_statement&pm=12107 此题想了半天,当时瞥到了Greedy,所以就想着贪心,最后的方法 ...
- Filter(过滤器)常见应用
孤傲苍狼 只为成功找方法,不为失败找借口! javaweb学习总结(四十六)——Filter(过滤器)常见应用 一.统一全站字符编码 通过配置参数charset指明使用何种字符编码,以处理Html F ...
- 腾讯QQ的开发分客户端软件和服务器端软件
Windows客户端主要是C++ COM/ATL Q+Web 后端C++ CGI ,前端javascript和flash 望采纳 腾讯QQ使用何种开发平台? 腾讯QQ的开发分客户端软件和服务器端软件两 ...
- [Unity菜鸟] 射线
1. 射线用 Physics.Raycast 都可以判断,用 collider.Raycast 只在某些(不明)情况下可以 void Update() { Ray ray = Camera.main. ...
- NSDictionary 键值对查找
NSDictionary *dic1=[NSDictionary dictionaryWithObjectsAndKeys: @"1",@"a", ...
- 8、SpringMVC源码分析(3):分析ModelAndView的形成过程
首先,我们还是从DispatcherServlet.doDispatch(HttpServletRequest request, HttpServletResponse response) throw ...
- public View getView(int position, View convertView, final ViewGroup parent)三个参数的意思
最近看到有人在问这三个参数的含义,其实帮助已经很详细的介绍了这三个参数,看来还是要好好学学英语了,不然连解释都看不懂. /** * Get a View that displays the d ...
- CF 366E Dima and Magic Guitar(最远哈密顿距离)
题目链接:http://codeforces.com/problemset/problem/366/E 题意:给出一个n*m的数字矩阵A,每个矩阵元素的范围[1,K].给出一个长度为s的数字串B,B的 ...
- 使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务
使用 Oracle GoldenGate 在 Microsoft SQL Server 和 Oracle Database 之间复制事务 作者:Nikolay Manchev 分步构建一个跨这些平台的 ...