C++11 lambda表达式(19篇C++11文章)
C++11引入了lambda表达式,使得程序员可以定义匿名函数,该函数是一次性执行的,既方便了编程,又能防止别人的访问。
Lambda表达式的语法通过下图来介绍:
这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。
- Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。
- Lambda表达式的参数列表
- Mutable 标识
- 异常标识
- 返回值
- “函数”体,也就是lambda表达式需要进行的实际操作
将上图的代码片段补充完整:
int x = 10;
int y = 3;
int z ;
z = [=]()mutable throw() -> int { int n = x + y; x = y ; y = n; return n;}();
cout<<z<<endl;
cout<<"x:"<<x<<"\t"<<"y:"<<y<<endl;
运行结果为:
13
x: 10 y: 3
因为是以值传递的方式访问x,y所以x,y的值并没有发生改变
现在我们队lambda表达式的基本语法已经有一些了解,下面来举几个例子。
首先这个例子说明如何向lambda表达式里面传递参数:
#include <iostream>
using namespace std;
int main()
{
int n = [] (int x, int y) { return x + y; }(5, 4);
cout << n << endl;
}
运行结果为:9
通过这个例子我们可以看出,通过“函数体”后面的‘()’传入参数。
接下来这个例子可以看出,可以像调用函数一样使用lambda表达式,但是感觉这种方式和普通函数的定义与调用就差不多了,这里只是学习使用方式而已。
#include <iostream>
using namespace std;
int main()
{
auto f = [] (int x, int y) { return x + y; };
cout << f(21, 12) << endl;
}
运行结果为:33
Lambda表达式与STL算法一起使用,自己写测试代码的时候经常用到排序、输出数组什么的,通过下面列举的几个算法也比较方便:
#include <iostream>
#include <algorithm>
#include <ctime>
using namespace std;
int main()
{
int a[10] = {0};
srand(time(NULL));
generate(a,a+10,[]()->int { return rand() % 100; });
cout<<"before sort: "<<endl;
for_each(a, a+10, [&](int i){ cout<< i <<" "; });
cout<<endl;
cout<<"After sort"<<endl;
sort(a,a+10);
for_each(a, a+10, [&](int i){ cout<< i <<" "; });
return 0;
}
Lambda表达式的嵌套:
#include <iostream>
int main()
{
using namespace std;
int m = [](int x)
{ return [](int y) { return y * 2; }(x) + 3; }(5);
cout << m << endl;
}
运行结果:13
以上代码在VC10和VC11上都能顺利编译通过。感觉lambda表达式还是比较有意思的语法,也是我接触的第一个VC11扩展。
http://www.cnblogs.com/zhuyp1015/archive/2012/04/08/2438176.html
http://www.cnblogs.com/zhuyp1015/category/370450.html
C++11 lambda表达式(19篇C++11文章)的更多相关文章
- 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 ...
随机推荐
- Android 数据库的线程合作
前言:之前琢磨了很多线程相关的东西,一直摸不着头脑,直到学到了数据库,终于发现世界原来如此美好,任何事物都有存在的理由. 1.主线程,我把它比作长江,作为母亲河的长江,想必大家每个人都不会很陌生. 2 ...
- python面向对象三大特性
面向对象的三大特性: 封装.继承和多态 一.封装 封装,顾名思义就是将内容封装到某个地方,以后可以直接调用被封装到某处的内容. - 将内容封装到某处 - 从某处调用被封装的内容 第一步,将内容封装到某 ...
- ansible-1
ansible与salt对比: 相同: 都是为了同时在多台机器上执行相同的命令 都是python开发 不同: agent(saltstack需要安装.ansible不需要) 配置(salt配置麻烦,a ...
- 获取HTTP请求头中的地址
技术交流群:233513714 public static String getIpAddr(HttpServletRequest request) { String ip = request.get ...
- Monkey、Monkeyrunner之间的区别
Monkey.Monkeyrunner之间的区别 一.Monkey Monkey是Android中的一个命令行工具,可以运行在模拟器里或实际设备中.它向系统发送伪随机的用户事件流(如按键输入.触摸屏输 ...
- net对象的克隆
class Person { public string name; public List<string> hobby; } void main() { Person p1 = new ...
- 孤荷凌寒自学python第三十一天python的datetime.timedelta模块
孤荷凌寒自学python第三十一天python的datetime.timedelta模块 (完整学习过程屏幕记录视频地址在文末,手写笔记在文末) datetime.timedelta模块是一个表示 ...
- 平衡二叉树(AVL)
AVL就是优化二叉查找树 平衡因子不大于1 左 < 根 < 右 具体看代码 #include<bits/stdc++.h> using namespace std; typed ...
- 网络编程--广播&组播
广播 1.广播地址 如果用{netid, subnetid, hostid}( {网络ID,子网ID,主机ID})表示IPv4地址.那么有四种类型的广播地址,我们用-1表示所有比特位均为1的字段: 1 ...
- 系统编程--标准IO
1.流和FILE对象 对于国际字符集,一个字符可以由一个以上的字节来表示.标准I/O文件流可以用来操作单字节和多字节(宽,wide)字符集.一个流的方向(orientation)决定了字符是以单字节还 ...