lambda 表达式
C++0x 的语法还是比较简单。下面通过几个例子来介绍下。
先是通过 std::for_each 演示一个简单的例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
#include <iostream>#include <vector>#include <algorithm>int main() { std::vector<int> my_vector({1, 2, 3, 4 ,5}); std::for_each(my_vector.begin(), my_vector.end(), [](int value) { std::cout << value << std::endl; }); return 0;} |
首先,是不是发现 my_vector 的构造函数怪怪的呢。因为C++0x支持一种从C带来的初始化列表概念,
语法类似于 C 的 int array[] = {1, 2, 3, 4 ,5}。关于这个详细介绍,有机会下次再介绍
。
1.Lambda 的格式
对于这里的 lambda:[](int value) { std::cout << value << std::endl; }
从这里看出,lambda 是以 [] 开头的匿名函数。这个lambda 仅仅把参数打印出来,是一个 void 的函数。
对于需要返回值的 lambad,格式如下:[](int a, int b) { return a + b;}
在这里,返回值的类型是 decltype(a + b),decltype是一个新关键词,用于在编译期推导出类型。
如果想强制设定返回值类型,可以这样编写:[](int a, int b) -> int { return a + b;}
这里把返回值设置为 int 型。
2. [] 的表示方式
C++ 的 lambad 是支持闭包的。那么,是通过 [] 来表示 lambda 的变量集合,即闭包。
|
1
2
3
4
5
6
7
8
|
[] //没有定义变量,使用未定义的变量会导致错误。[a, &b] //a以传值方式传入,b以引用方式传入[&] // 表示在 lambda所使用到的变量,皆以引用方式传入[=] // 表示在 lambda所使用到的变量,皆以传值方式传入[&, a] //表示 a 以传值方式传入,其他都是以引用方式传入[=, &a] // 表示 a 以引用方式传入,其他都是以传值方式传入如果企图修改以值传入的变量,则编译的时候会报错(gcc 4.5) |
下面来看看一个闭包的lambda例子:
|
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
#include <iostream>#include <vector>#include <algorithm>int main() { std::vector<int> my_vector({1, 2, 3, 4 ,5}); int total = 0; std::for_each(my_vector.begin(), my_vector.end(), [&total](int value) { total++; }); std::cout << "total:" << total << std::endl; return 0;} |
这里的输出结果是: total:5
3.涉及 this 指针的使用
在成员函数中涉及到对象的 this 指针,必须显式地传入lambda函数,否则成员函数的lambda函数无法使用任何对象的变量或者函数,格式如下:
[this]() { this->call_function(); }
lambda 表达式的更多相关文章
- 你知道C#中的Lambda表达式的演化过程吗?
那得从很久很久以前说起了,记得那个时候... 懵懂的记得从前有个叫委托的东西是那么的高深难懂. 委托的使用 例一: 什么是委托? 个人理解:用来传递方法的类型.(用来传递数字的类型有int.float ...
- Linq表达式、Lambda表达式你更喜欢哪个?
什么是Linq表达式?什么是Lambda表达式? 如图: 由此可见Linq表达式和Lambda表达式并没有什么可比性. 那与Lambda表达式相关的整条语句称作什么呢?在微软并没有给出官方的命名,在& ...
- 背后的故事之 - 快乐的Lambda表达式(一)
快乐的Lambda表达式(二) 自从Lambda随.NET Framework3.5出现在.NET开发者眼前以来,它已经给我们带来了太多的欣喜.它优雅,对开发者更友好,能提高开发效率,天啊!它还有可能 ...
- Kotlin的Lambda表达式以及它们怎样简化Android开发(KAD 07)
作者:Antonio Leiva 时间:Jan 5, 2017 原文链接:https://antonioleiva.com/lambdas-kotlin/ 由于Lambda表达式允许更简单的方式建模式 ...
- java8中lambda表达式的应用,以及一些泛型相关
语法部分就不写了,我们直接抛出一个实际问题,看看java8的这些新特性究竟能给我们带来哪些便利 顺带用到一些泛型编程,一切都是为了简化代码 场景: 一个数据类,用于记录职工信息 public clas ...
- 背后的故事之 - 快乐的Lambda表达式(二)
快乐的Lambda表达式 上一篇 背后的故事之 - 快乐的Lambda表达式(一)我们由浅入深的分析了一下Lambda表达式.知道了它和委托以及普通方法的区别,并且通过测试对比他们之间的性能,然后我们 ...
- CRL快速开发框架系列教程二(基于Lambda表达式查询)
本系列目录 CRL快速开发框架系列教程一(Code First数据表不需再关心) CRL快速开发框架系列教程二(基于Lambda表达式查询) CRL快速开发框架系列教程三(更新数据) CRL快速开发框 ...
- Lambda 表达式递归用法实例
注意: 使用Lambda表达式会增加额外开销,但却有时候又蛮方便的. Windows下查找子孙窗口实例: HWND FindDescendantWindows(HWND hWndParent, LPC ...
- Spark中Lambda表达式的变量作用域
通常,我们希望能够在lambda表达式的闭合方法或类中访问其他的变量,例如: package java8test; public class T1 { public static void main( ...
- 释放Android的函数式能量(I):Kotlin语言的Lambda表达式
原文标题:Unleash functional power on Android (I): Kotlin lambdas 原文链接:http://antonioleiva.com/operator-o ...
随机推荐
- Java 使用正则表达式
用正则表达式来处理掉内容中的特定字符,下面的代码为,去掉P标签中的属性width 设置.将P标签处理后在拼接成字符串 /** * 给 P 标签去掉width 样式设置 * @param content ...
- Java设计模式-状态模式(State)
核心思想就是:当对象的状态改变时,同时改变其行为,很好理解!就拿QQ来说,有几种状态,在线.隐身.忙碌等,每个状态对应不同的操作,而且你的好友也能看到你的状态,所以,状态模式就两点:1.可以通过改变状 ...
- Facebook Hacker Cup 2014 Qualification Round 竞赛试题 Square Detector 解题报告
Facebook Hacker Cup 2014 Qualification Round比赛Square Detector题的解题报告.单击这里打开题目链接(国内访问需要那个,你懂的). 原题如下: ...
- Oracle修改数据表
(1)修改数据表中某个字段值为空: update 表明 别名 set 别名.字段名 例子:update JWT_JYWF t set t.jdsbh=''(2)设置数据表中某个字段值和rownu ...
- POJ-2299 Ultra_QuickSort 线段树+逆序对数
Ultra-QuickSort Time Limit: 7000MS Memory Limit: 65536K Total Submissions: 50737 Accepted: 18595 Des ...
- linux c学习笔记----进程创建(fork,wait,waitpid)
1.pid_t fork(); (1)当一个进程调用了fork 以后,系统会创建一个子进程.这个子进程和父进程不同的地方只有他的进程ID 和父进程ID,其他的都是一样.就象符进程克隆(clone)自己 ...
- Win7下JDK环境变量的设置
JDK并不像Microsoft阵营vs那样智能,安装好后所有的东西都给你配置好了,我们还没需要手动配置很多东西 首先说为什么要配置JDK的环境变量在任何路径下识别java命令和java类 配置分为2个 ...
- hdu 2199 Can you solve this equation?
#include<stdio.h> #include<math.h> double f(double x) { return 8*x*x*x*x+7*x*x*x+2*x*x+3 ...
- webservice原理
webservice的工作原理 WebService的主要目标是跨平台的可互操作性.为了达到这一目标,WebService完全基于XML(可扩展标记语言).XSD(XMLSchema)等独立于平台 ...
- Telnet是什么?
Telnet协议是 用途一: 测试端口号 例子:测试本机的80端口是否打开 1.获得本机IP dos命令:ipconfig 可以看到本机的IP地址是192.168.0.102,当然这也是局域网IP,并 ...