C++入门——“C++11-lambda”

news2024/11/29 9:45:02

引入

C++11支持lambda表达式,lambda是一个匿名函数对象,它允许在函数体中直接定义。

一、初识lambda

        lambda的结构是:[ ] () -> 返回值类型 { }。从左到右依次是:捕捉列表 函数参数 -> 返回值类型 函数体。

        以下是一段用lambda实现的求和功能的函数:

#include<iostream>

using namespace std;

int main()
{
	//lambda
	auto sum = [](int x, int y) -> int { return x + y; };
	
	cout << sum(1, 2) << endl;


	return 0;
}

        这段代码的运行结果为:

5e447f2464b74055ae0abedeccf9e598.png

二、lambda的注意事项

        1.在使用lambda的时候,有几个参数是可以直接省略的:

        1.参数列表可以省略(写() 或者不写())。

        2.返回值可以省略(不写 -> 类型)。

        除此之外的东西都不可省略(捕捉列表,函数体实现)。

#include<iostream>

using namespace std;

int main()
{
	//lambda
	auto sum = []{ return 3 + 1; };
	
	cout << sum() << endl;


	return 0;
}

        运行结果:

6d4d1dba2369404db8ad7dc1ff839a8b.png

        值得注意的是,在省略参数列表的时候(即不写 () ),返回值也要省略(不写-> 类型)。

2.捕捉列表

        在C++中的lambda里,捕捉列表不可省略不写,它的作用是用来捕捉函数外部的变量,因为在lambda外部的变量是不被允许使用的,比如:

#include<iostream>

using namespace std;

int main()
{
	int a = 0, b = 1, c = 2;
	//lambda
	auto sum = [a ,b , c] { cout <<  a << endl; return b + c; };
	
	cout << sum() << a << endl;


	return 0;
}

        其中, cout <<  a << endl; 这个行为是不被允许的,编译器会报错:

5013ebf96e18457391ab3d1cf1d87668.png

        那么当我们将也a写在捕捉列表中,它就没问题了。

        当然了,如果需要捕捉的参数很多,那么lambda也提供了十分便捷的捕捉方式,那就是在捕捉列表里面直接写上 “=” 符号,这就是隐式捕捉lambda外的变量。然而,也可以在捕捉列表中写入“&”符号,表示隐式的引用捕捉。

        a.写“=”的隐式捕捉:

#include<iostream>

using namespace std;

int main()
{
	int a = 0, b = 1, c = 2;
	//lambda
	auto sum = [=] { cout << a << endl; return b + c; };
	
	cout << sum() <<  " " << a << endl;


	return 0;
}

        运行结果如下:

84af1a64362b4beb8b8c948c5cc0fbeb.png

        b.写“&”的隐式捕捉:

#include<iostream>

using namespace std;

int main()
{
	int a = 0, b = 1, c = 2;
	//lambda
	auto sum = [&] { cout << a << endl; return b + c; };
	
	cout << sum() <<  " " << a << endl;


	return 0;
}

        运行结果如下:

a0384d0b29a141bca7a5e055680e7f13.png

        这两种捕捉方式是有区别的:捕捉列表捕捉的参数默认是带有const属性的,除了引用捕捉以外,都不可在lambda里面修改捕捉到的参数。



        a.写“&”,并且改变捕捉到的参数的捕捉:

#include<iostream>

using namespace std;

int main()
{
	int a = 0, b = 1, c = 2;
	//lambda
	auto sum = [&] { cout << a << endl; a = 1; return b + c; };
	
	cout << sum() <<  " " << a << endl;


	return 0;
}

        运行结果:

4c3ccd784df64a10ae620b5dc72a2f3a.png

        b.写“=”,并且改变捕捉到的参数的捕捉:

#include<iostream>

using namespace std;

int main()
{
	int a = 0, b = 1, c = 2;
	//lambda
	auto sum = [=] { cout << a << endl; a = 1; return b + c; };
	
	cout << sum() <<  " " << a << endl;


	return 0;
}

        运行结果(报错):

101382820ff74a48a7d180e43028fe94.png

        c.直接显式捕捉,并且改变捕捉到的参数的捕捉:

#include<iostream>

using namespace std;

int main()
{
	int a = 0, b = 1, c = 2;
	//lambda
	auto sum = [a, b, c] { cout << a << endl; a = 1; return b + c; };
	
	cout << sum() <<  " " << a << endl;


	return 0;
}

        运行结果(报错):

6405f1b8579148079bfbc42d55551fff.png



        在使用隐式捕捉的时候,不必担心捕捉列表把所有的参数都捕捉到,这个类似于模板的按需实例化:当lambda里面用到了啥,它就捕捉啥:

#include<iostream>

using namespace std;

int main()
{
	int a = 0, b = 1, c = 2;
	//lambda
	auto sum = [=] { return b + c; };
	
	cout << sum() <<  " " << a << endl;


	return 0;
}

        这段代码使用了隐式捕捉,并且函数体没有使用a变量,让我们转到汇编:

831f0a63b38d4524b6c7b700cc0f9138.png

        可以看到只把c,b加载到寄存器中,并没有把a加载到寄存器,因此可以证明lambda的按需捕捉。

 

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

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

相关文章

【Linux网络编程】第二弹---Socket编程入门指南:从IP、端口号到传输层协议及编程接口全解析

✨个人主页&#xff1a; 熬夜学编程的小林 &#x1f497;系列专栏&#xff1a; 【C语言详解】 【数据结构详解】【C详解】【Linux系统编程】【Linux网络编程】 目录 1、Socket 编程预备 1.1、理解源 IP 和目的 IP 1.2、认识端口号 1.2.1、端口号范围划分 1.2.2、理解 &q…

《用Python实现3D动态旋转爱心模型》

简介 如果二维的爱心图案已经无法满足你的创意&#xff0c;那今天的内容一定适合你&#xff01;通过Python和matplotlib库&#xff0c;我们可以实现一个动态旋转的3D爱心模型&#xff0c;充满立体感和动感。# 实现代码&#xff08;完整代码底部名片私信&#xff09; 以下是完…

shell-函数调用进阶即重定向

shell-函数调用进阶 声明&#xff01; 学习视频来自B站up主 泷羽sec 有兴趣的师傅可以关注一下&#xff0c;如涉及侵权马上删除文章&#xff0c;笔记只是方便各位师傅的学习和探讨&#xff0c;文章所提到的网站以及内容&#xff0c;只做学习交流&#xff0c;其他均与本人以及泷…

【高等数学学习记录】微分中值定理

一、知识点 &#xff08;一&#xff09;罗尔定理 费马引理 设函数 f ( x ) f(x) f(x) 在点 x 0 x_0 x0​ 的某邻域 U ( x 0 ) U(x_0) U(x0​) 内有定义&#xff0c;并且在 x 0 x_0 x0​ 处可导&#xff0c;如果对任意的 x ∈ U ( x 0 ) x\in U(x_0) x∈U(x0​) &#xff0…

【vue-router】vue-router如何实现动态路由

✨✨ 欢迎大家来到景天科技苑✨✨ &#x1f388;&#x1f388; 养成好习惯&#xff0c;先赞后看哦~&#x1f388;&#x1f388; &#x1f3c6; 作者简介&#xff1a;景天科技苑 &#x1f3c6;《头衔》&#xff1a;大厂架构师&#xff0c;华为云开发者社区专家博主&#xff0c;…

Web前端技术浅谈CooKieAG网址漏洞与XSS攻防策略

随着互联网技术的飞速发展,Web前端开发已经成为构建网站和应用程序的重要环节。然而,Web前端开发中存在许多安全问题,这些问题不仅会影响用户体验,还可能给企业和个人带来严重的经济损失。但是web前端安全方面技术包含的东西较多&#xff0c;我们这里着重聊一聊关于XSS 的危害与…

关于VNC连接时自动断联的问题

在服务器端打开VNC Server的选项设置对话框&#xff0c;点左边的“Expert”&#xff08;专家&#xff09;&#xff0c;然后找到“IdleTimeout”&#xff0c;将数值设置为0&#xff0c;点OK关闭对话框。搞定。 注意,服务端有两个vnc服务,这俩都要设置ide timeout为0才行 附件是v…

51c自动驾驶~合集35

我自己的原文哦~ https://blog.51cto.com/whaosoft/12206500 #纯视觉方案的智驾在大雾天还能用吗&#xff1f; 碰上大雾天气&#xff0c;纯视觉方案是如何识别车辆和障碍物的呢&#xff1f; 如果真的是纯纯的&#xff0c;特头铁的那种纯视觉方案的话。 可以简单粗暴的理解为…

计算分数的浮点数值

计算分数的浮点数值 C语言代码C 代码Java代码Python代码 &#x1f490;The Begin&#x1f490;点点关注&#xff0c;收藏不迷路&#x1f490; 两个整数a和b分别作为分子和分母&#xff0c;既分数 a/b &#xff0c;求它的浮点数值&#xff08;双精度浮点数&#xff0c;保留小数点…

戴尔电脑安装centos7系统遇到的问题

1&#xff0c;找不到启动盘&#xff08;Operation System Loader signature found in SecureBoot exclusion database(‘dbx’).All bootable devices failed secure Boot Verification&#xff09; 关闭 Secure Boot&#xff08;推荐&#xff09;&#xff1a; 进入 BIOS/UEFI…

简单获取json预览

data: JSON 数据。 collapsedNodeLength: 对象或数组的长度超过此阈值时会折叠 deep: json路径深度超过此值时会折叠 showLineNumber: 显示左侧行号 showIcon: 显示图标。 virtual: 使用虚拟滚动 height: 使用虚拟滚动时列表的高度 itemHeight: 使用虚拟滚动时节点的高…

ChatGPT/AI辅助网络安全运营之-数据解压缩

在网络安全的世界中&#xff0c;经常会遇到各种压缩的数据&#xff0c;比如zip压缩&#xff0c;比如bzip2压缩&#xff0c;gzip压缩&#xff0c;xz压缩&#xff0c;7z压缩等。网络安全运营中需要对这些不同的压缩数据进行解压缩&#xff0c;解读其本意&#xff0c;本文将探索一…

Cookie概念和API

Cookie概念 Cookie在HTTP中它表示服务器送给客户端浏览器的小甜点。其实Cookie就是一个键和一个值构成的&#xff0c;随着服务器端的响应发送给客户端浏览器。然后客户端浏览器会把Cookie保存起来&#xff0c;当下一次再访问服务器时把Cookie再发送给服务器。 Cookie是由服务器…

qt音频实战

一、Qt音频基础知识 1、QT multimedia 2、QMediaPlayer类&#xff1a;媒体播放器&#xff0c;主要用于播放歌曲、网络收音机等功能。 3、QMediaPlaylist类&#xff1a;专用于播放媒体内容的列表。 二、界面设计 三、代码 #include "mainwindow.h" #include "…

GDPU Android移动应用 数据存储

又是学到了数据持久化。 登录界面 题外话&#xff1a;有无动画大佬带带呀&#xff0c;前端移动端可免( •̀ .̫ •́ )&#xff0c;合作可私信哦。 1.用户登陆和“记住我”功能 该内容拥有两个Activity活动视图&#xff1a; &#xff08;1&#xff09;LoginActivity&#x…

Java算法OJ(11)双指针练习

目录 1.前言 2.正文 2.1存在重复数字 2.1.1题目 2.1.2解法一代码 解析&#xff1a; 2.1.3解法二代码 解析&#xff1a; 2.2存在重复数字plus 2.2.1题目 2.2.2代码 2.2.3解析 3.小结 1.前言 哈喽大家好吖&#xff0c;今天来给大家分享双指针算法的相关练习&…

天锐绿盾加密软件与Ping32联合打造企业级安全保护系统,确保敏感数据防泄密与加密管理

随着信息技术的飞速发展&#xff0c;企业在日常经营过程中产生和处理的大量敏感数据&#xff0c;面临着越来越复杂的安全威胁。尤其是在金融、医疗、法律等领域&#xff0c;数据泄漏不仅会造成企业巨大的经济损失&#xff0c;还可能破坏企业的信誉和客户信任。因此&#xff0c;…

Git上传本地项目到远程仓库(gitee/github)

目录 序言一、创建git本地版本库二、连接远程仓库&#xff08;以gitee为例&#xff09;三、将项目提交到git&#xff08;本地&#xff09;版本库1.由工作区添加到暂存区2.由暂存区添加到版本库 四、将代码由本地仓库上传到 gitee远程仓库1.获取远程库与本地同步2.把当前分支 ma…

C7.【C++ Cont】范围for的使用和auto关键字

目录 1.知识回顾 2.范围for 格式 使用 运行结果 运行过程 范围for的本意 作用 注意 3.底层分析范围for的执行过程 反汇编代码 分析 4.auto关键字 格式 基本用法 在范围for中使用auto 1.知识回顾 for循环的使用参见25.【C语言】循环结构之for文章 2.范围for C…

【仓颉学习02】编译后运行报错:“由于找不到libcanjie-runtime.dll,无法继续执行代码。重新安装程序可能会解决此问题。”

敲了段《仓颉语言实践》&#xff08;张磊著&#xff09;书上的代码&#xff0c;如下&#xff1a; package test //coding:utf-8struct Employee{var name:Stringprivate var realSalary:Float64public Employee(name:String,realSalary:Float64){this.namenamethis.realSalary…