C++11系列学习之二-----lambda表达式

C++11添加了一项名为lambda表达式的新功能,通过这项功能可以编写内嵌的匿名函数,而不必编写独立函数和函数对象,使得代码更容易理解。

lambda表达式的语法如下所示:
[capture_block](parameters) exceptions_specification -> return_type {body}

[捕捉块](参数) 异常 -> 返回值类型 {主体}

或者更直白地看如下:


  这里假设我们定义了一个如上图的lambda表达式。现在来介绍途中标有编号的各个部分是什么意思。

1. Lambda表达式的引入标志,在‘[]’里面可以填入‘=’或‘&’表示该lambda表达式“捕获”(lambda表达式在一定的scope可以访问的数据)的数据时以什么方式捕获的,‘&’表示一引用的方式;‘=’表明以值传递的方式捕获,除非专门指出。
2. Lambda表达式的参数列表
3. Mutable 标识
4. 异常标识
5. 返回值类型
6.“函数”体,也就是lambda表达式需要进行的实际操作



下面的例子将逐步演示如何使用lambda表达式:


范例一:无参数的lambda表达式

[]{std::cout<<"Hello from Lambda!"<<std::endl;}();

or

[](){std::cout << "Hello from Lambda!" << std::endl; }();

输出如下所示:

Hello from Lambda
在控制台输出Hello from Lambda,尾部的括号使该表达式可立即执行。

范例二:带参数的lambda表达式


string str = [](const string& str)->string{return "Hello from " + str; }("second lambda");
cout << str << endl;

输出如下所示:

Hello from second Lambda
该lambda表达式接受一个string参数并返回一个string,结果保存在变量result中,尾部的括号使得该表达式立即执行。

范例三:像平常的调用函数一样使用lamdba表达式

	auto f = [](std::string str)->string{return "hello from " + str; };auto f2 = [](std::string str) {return "hello from " + str; };cout << f2("third lambda") << endl;

输出如下所示:

     hello from third lambda

此处保存指向lambda表达式的指针,并且通过函数指针执行该表达式。

范例四:(STL与lambda)
#include <iostream>
#include <algorithm>
#include <vector>auto main(int argc, char** argv) -> int
{
std::vector<int> vec={1, 2, 3, 4, 5, 6, 7, 8, 9};
int value=3;
int cnt=std::count_if(vec.cbegin(), vec.cend(), [=](int i){return i>value;});
std::cout<<"Found "<<cnt<<" values > "<<value<<std::endl;return 0;
}


输出如下所示:

Found 6 values > 3


通过count_if算法计算vector中满足特定条件的元素个数,lambda表达式的形式给出了条件,注意表达式中的=,等号表示通过值捕捉所在作用域的变量,这个例子中捕捉的是value的值。前面的例子[]为空,即捕捉块为空,那么在lambda表达式的主体body内就无法访问变量了。以下是关于捕捉块的详细介绍:

[=]   通过值捕捉所有变量
[&]  通过引用捕捉所有变量
[value] 通过值捕捉value,不捕捉其它变量
[&value] 通过引用捕捉value,不捕捉其它变量
[=, &value] 默认通过值捕捉,变量value例外,通过引用捕捉
[&, value] 默认通过引用捕捉,变量value例外,通过值捕捉


范例五
:(STL与lambda结合)
#include <iostream>
#include <algorithm>
#include <vector>auto main(int argc, char** argv) -> int
{
std::vector<int> vec2 = { 11, 22, 33, 44 };
int index = 0;
for_each(vec2.begin(), vec2.end(), [index](int i){std::cout << "Value " << (index++) << ": " << i << std::endl; });
return 0;
}

注意:这里必须使用[&index],而不能使用[index],原因在于index++;否则会出现

错误提示:不能在非可变 lambda 中修改按值捕获


通过for_each算法可以对给定范围中的所有元素执行特定操作,调用lambda表达式,并将这个值作为参数传递给lambda表达式。

范例六:(多个参数)

int n = [](int x, int y) { return x + y; }(5, 4);cout << n << endl;

从以上示例来看,

1.如果我们想要提示返回的类型,就要加上->return_type {},否则,直接使用{}即可。

2.C++ 11的lamdba表达式来源于其它语言,像Python,也有lamdba表达式。如:lambda x: x * x

范例程序差不多了,在C++11中,官方似乎一直鼓励大家用lambda表达式,而不是函数对象,lambda表达式更易于使用和理解。



本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/259238.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

GCPC2014 C Bounty Hunter

题意&#xff1a;给你一个平面上的点集&#xff08;x值各不相等&#xff09;&#xff0c;问你从最左边走到最右边&#xff08;只能以x递增的顺序&#xff09;&#xff0c;再从最右边回到最左边&#xff08;以x递减的顺序&#xff09;问你最短距离是多少。 解题思路&#xff1a;…

计算机启动时运行ccleaner,Ccleaner的使用方法

ccleaner是一款非常好用的系统优化工具&#xff0c;它可以提升电脑速度&#xff0c;可以对上网历史记录、临时文件夹、回收站垃圾清理、注册表进行垃圾项扫描和清理、软件卸载等功能&#xff0c;保护用户的个人浏览隐私&#xff0c;为Windows系统腾出更多硬盘空间。下面小编就为…

PLSQL Developer软件使用大全

PLSQL Developer软件使用大全 第一章 PLSQL Developer特性 PL/SQL Developer是一个集成开发环境&#xff0c;专门面向Oracle数据库存储程序单元的开发。如今&#xff0c;有越来越多的商业逻辑和应用逻辑转向了Oracle Server&#xff0c;因此&#xff0c;PL/SQL编程也成了整个开…

电脑显示器变色_电脑维修(看完后就可以开一家自己的电脑维修店!)

第二部分 常见故障判断本部分将计算机从开机一直到关机期间的故障进行分类。每一类的判断、定位过程都是第一部分中维修判断一节的有机组成部分&#xff0c;即不论使用什么方法或不论去判断什么内容&#xff0c;这两部分总是相互结合使用的。以下各故障类型中所列的故障现象只是…

linux运维基础篇 unit7

unit 71.进程定义进程就是cpu未完成的工作2.ps命令psa ##关于当前环境的所有进程x ##与当前环境无关的所有进程f ##显示进程从属关系e ##显示进程调用环境工具的详细信息l ##长列表显示进程的详细信息u ##显…

运行快捷指令无法连接服务器失败,快捷指令打不开怎么回事?iPhone快捷指令无法载入的解决办法...

经常会有果粉朋友反馈&#xff0c;自己的 iPhone 快捷指令打不开。具体表现是&#xff0c;在 Safari 浏览器中&#xff0c;打开快捷指令下载安装页面&#xff0c;点击“获取捷径”后&#xff0c;一直卡在快捷指令中心正在载入页面&#xff0c;等半天都无法正常载入需要安装的快…

maven搭建多模块项目和管理

在eclipse下构建maven项目&#xff0c;该项目由多个子模块组成。 1.创建一个父项目 NEW -->project-->maven-->maven Project&#xff0c;点击下一步&#xff0c;进入new maven Project的Select project name and location界面 &#xff0c;什么也不做&#xff0c;直接…

shsh验证服务器,教你从Cydia上取出SHSH并验证有效性!

原标题&#xff1a;教你从Cydia上取出SHSH并验证有效性&#xff01;今天在第一篇内容中和大家说了如何让32位设备进行降级&#xff0c;但这其中有个很重要的问题就是如何提取出对应设备的SHSH&#xff0c;虽然说本篇内容并不是对所有人都有效&#xff0c;但至少多了一个可选择的…

n!后面有多少个0(转载)

我的思路&#xff1a; 从”那些数相乘可以得到10”这个角度&#xff0c;问题就变得比较的简单了。 首先考虑&#xff0c;如果N的阶乘为K和10的M次方的乘积&#xff08;N&#xff01;K∗10M&#xff09;&#xff0c;那么N!末尾就有M个0。 如果将N的阶乘分解后&#xff0c;那么…

ico的尺寸_批量压缩、加水印、调整尺寸……用这 6 款 Mac 图片工具一键解决

不论是写文章、做教程&#xff0c;还是处理摄影作品、上传社交平台&#xff0c;对图片的处理肯定少不了。庞大又贵重的专业软件不仅成本较高&#xff0c;还有着不小的上手难度。如果我们仅仅是想要&#xff1a;缩小图片体积、添加水印或者批量对图片进行操作等等&#xff0c;使…

转:MAC 下安装PHONEGAP开发环境

MAC 下安装PHONEGAP开发环境 什么是Phonegap呢&#xff1f;Phonegap是一个利用HTML5去开发App的框架。可以为安卓、iOS、WP、黑莓、火狐等移动操作系统。采用HTML5来编写交互界面。其优点是编写一次可以编译到各种移动平台上&#xff0c;大大为公司节省了开发周期。但是它也是有…

从零开始学android编程_android初学者的入门秘籍

大概是去年年底开始接触android原本是学习嵌入式的我&#xff0c;领导让我看看能不能搞一下这个android APP。一开始的我懵逼得很。。。这android APP 不是得用java写吗&#xff1f;&#xff1f;&#xff1f; 现在我看网上说比较多还是用kotlin&#xff0c;没去学。。。好家伙&…

web中的cookie管理

本篇是以JSP为背景介绍&#xff0c;但是在web开发中也是相同的原理。 什么是cookie 由于http是一种无状态的协议&#xff0c;因此服务器收到请求后&#xff0c;只会当做一次新的请求。即便你重复发送了1000次同样的请求&#xff0c;这1000次都属于独立的请求。 这样显然效率很低…

unity怎么设置游戏页面_杭州有没有正规的unity游戏开发培训机构?

现在Unity游戏开发是个火热的行业&#xff0c;薪资待遇比较高&#xff0c;未来的发展方向和前景也比较不错&#xff0c;很多人也都想成为专业Unity游戏开发工程师&#xff0c;学习Unity游戏开发已经成为很多追求更好就业前景的人的选择。学习专业、系统的Unity游戏开发知识并达…

VC++ 使用attributes定义接口

1.定义预处理命令_ATL_ATTRIBUTES 2.在一个全局的Cpp文件里面配置module的attribute [module(dll, uuid "{3845951F-15B8-4286-8E7D-E9D4F5C7B6CE}", name "TestApp")]3.定义接口 [object,uuid("9F414A8A-1D5E-4aff-A60E-CFD65155ABB6"),dual,…

Knockout.Js案例一Introduction

在这第一个教程中,您将体验的一些基本知识构建的web UI Model-View-ViewModel使用knockout.js(MVVM)模式。案例1&#xff1a;添加:data-bind <p>First name: <strong data-bind"text:firstName">1</strong></p><p>Last name: <stro…

谷歌浏览器外贸版_做外贸快两个月,没有单怎么办?

Hello 大家好&#xff0c;我是Jack。今天给大家更新一篇在知乎看到的外贸问题&#xff1a;做外贸快两个月&#xff0c;没有单怎么办?外贸这个话题在知乎算是小众话题了&#xff0c;相比较于职场&#xff0c;英语学习&#xff0c;国际政治&#xff0c;IT等&#xff0c;这些话题…

React Native通信机制详解

http://blog.cnbang.net/tech/2698/ React Native是facebook刚开源的框架&#xff0c;可以用javascript直接开发原生APP&#xff0c;先不说这个框架后续是否能得到大众认可&#xff0c;单从源码来说&#xff0c;这个框架源码里有非常多的设计思想和实现方式值得学习&#xff0c…

excel打开2个独立窗口_谢楠称女性独立的不是钱是心 谢楠与吴京婚后生育2个儿子...

近日&#xff0c;在综艺节目《幸福三重奏》 三日谈妻子篇中&#xff0c;谢楠被问到如何看待独立女性时&#xff0c;反问记者会不会问吴京同样的问题&#xff1b;随后回答道&#xff0c;女性独立的不是钱&#xff0c;而是你的心&#xff1b;楠姐的回答超级霸气了&#xff0c;你们…

Linux学习 Unit 9

Unit9.openssh-server1.openssh-server功能&#xff1a;让远程主机可以通过网络访问sshd服务&#xff0c;开始一个安全shell2.客户端连接方式ssh远程主机用户远程主机ip[rootdesktop0 ~]# ssh root172.25.0.11The authenticity of host 172.25.0.11 (172.25.0.11) cant be esta…