C++ Primer Chapter 10 Generic Algorithms

Chapter 10 Generic Algorithms

10.3 定制操作

10.3.2 lambda 表达式

介绍lambda
可调用对象(callable object)
对于一个对象或一个表达式,如果对其使用调用运算符,则称它为可调用的。
即,如果e是一个可调用的表达式,则我们可以编写代码e(args),其中args是一个逗号分隔的一个或多个参数的列表。
lambda表达式(lambda expression)
一个lambda表达式表示一个可调用的代码单元。我们可以将其理解为一个未命名的内联函数。与任何函数类似,一个lambda具有一个返回类型、一个参数列表和一个函数体。但与函数不同,lambda可能定义在函数内部。
一个lambda表达式具有如下形式

[capture list] (parameter list)->return type	{ function body }

其中,capture list(捕获列表)是一个lambda所在函数中定义的局部变量的列表(通常为空);return type、parameter list和function body与任何普通函数一样,分别表示返回类型、参数列表和函数体。单数,与普通函数不同,lambda必须使用尾置返回来指定返回类型。

10.3.3 lambda捕获和返回

当定义一个lambda时,编译器生成了一个与lambda对应的新的(未命名的)类类型。
当向一个函数传递一个lambda时,同时定义了一个新类型和该类型的一个对象:传递的参数就是此编译器生成的类类型的未命名对象。
类似的,当使用auto定义一个用lambda初始化的变量时,定义了一个从lambda生成的类型的对象。
默认情况下,从lambda生成的类都包含一个对应该lambda所捕获的变量的数据成员。类似任何普通类的数据成员,lambda的数据成员也在lambda对象创建时被初始化。

值捕获
与参数不同,被捕获的变量的值是在lambda创建时拷贝,而不是调用时拷贝:

void fcn1()
{size_t v1=42;		//局部变量//将v1拷贝到名为f的可调用对象auto f=[v1] {return v1;};v1=0;auto j=f();			//j为42;f保存了我们创建它时v1的拷贝
}

引用捕获

void fcn2()
{size_t v1=42;		//局部变量//将v1拷贝到名为f的可调用对象auto f2=[&v1] {return v1;};v1=0;auto j=f();			//j为0;f2保存v1的引用,而非拷贝
}

WARNNING 当以引用方式捕获一个变量时,必须保证在lambda执行时变量是存在的。

隐式捕获
除了显式列出我们希望使用的来自所在函数的变量之外,还可以让编译器根据lambda体中的代码来推断我们要使用那些变量。为了指示编译器推断捕获列表,应在捕获列表中写一个&或=。&告诉编译器采用捕获引用方式,=则表示采用值捕获方式。
如果我们希望对一部分变量采用值捕获,对其他变量采用引用捕获,可以混合使用隐式捕获和显式捕获:

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

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

相关文章

如何使用Vue3和ApexCharts创建交互式热力图?

本文由ScriptEcho平台提供技术支持 项目地址:传送门 热力图:可视化数据分布 应用场景介绍 热力图是一种数据可视化技术,它使用颜色来表示数据点的值。热力图常用于可视化分布数据,例如人口密度、温度变化或网站流量。 代码基…

一个有趣的c++案例

1. 源码 #include <stdio.h> #include <stdint.h> #include <iostream>using namespace std;uint8_t a 0; uint8_t b 0;#define MY_LOG#ifdef MY_LOG#define my_log(...) printf(__VA_ARGS__); fflush(stdout)#else #define my_log(...) #endifvoid …

优化:Day52 动态规划part10

LC300最长递增子序列 dp数组中dp[i]的含义是&#xff1a;以nums[i]结尾的子序列中最长递增子序列的长度为dp[i]最长连续递增子序列 非连续最长递增子序列 如果是连续的&#xff0c;只需要nums[i]>nums[i-1]就将dp值1&#xff0c;但是如果是非连续的&#xff0c;nums[i]之前…

30天学会QT---------------大项目之在线考试系统

前段时间真的很忙很忙,忙完这段时间,总算是有空来写文章了,开始写的时候我就以为能够有时间准备和写这个,但是发现有时候忙着忙着就忘记了,没有办法来写项目,真的是非常尴尬。 现在有时间了,就有充分的时间来写了。 为了避免笔记断更,我决定先存稿来写。 1、如何规划项…

如何训练AI大模型?熬夜爆肝整理大全

随着人工智能技术的快速发展&#xff0c;大型预训练模型在自然语言处理、计算机视觉、语音识别等领域取得了显著成果。这些模型通过在海量数据上进行预训练&#xff0c;能够捕捉到丰富的特征信息&#xff0c;为各种下游任务提供强大的支持。然而&#xff0c;训练AI大模型面临着…

李光明从程序员到架构师的逆袭之路(一)

李光明是一名已经工作了两年的程序员&#xff0c;每天都沉浸在繁忙的996工作节奏中。在这段时间里&#xff0c;他感觉自己仿佛成为了一台编码机器&#xff0c;每天机械地编写着枯燥无味的代码&#xff0c;对于工作的热忱渐渐消磨在无尽的代码行中。 然而&#xff0c;一个偶然的…

16. 一个I/O项目:构建命令行程序(上)

标题 一、功能二 、接受命令行参数三、 读取文件四、重构改进模块性和错误处理4.1 二进制项目的关注分离4.2 提取参数解析器4.3 创建一个Config的构造函数4.4 传参错误处理4.5 从main中提取逻辑4.6 将代码拆分进crate 一、功能 grep 最简单的使用场景是在特定文件中搜索指定字…

Kubernetes 如何删除 Terminating 状态的 Pod

在 Kubernetes (k8s) 中&#xff0c;Pod 是运行容器化应用的最小部署单元。当我们删除一个 Pod 时&#xff0c;通常它会快速进入 Terminating 状态并被删除。然而&#xff0c;有时由于种种原因&#xff0c;Pod 会长时间停留在 Terminating 状态。本文将详细介绍如何处理和删除这…

深入Node.js:实现网易云音乐数据自动化抓取

随着互联网技术的飞速发展&#xff0c;数据已成为企业和个人获取信息、洞察市场趋势的重要资源。音频数据&#xff0c;尤其是来自流行音乐平台如网易云音乐的数据&#xff0c;因其丰富的用户交互和内容多样性&#xff0c;成为研究用户行为和市场动态的宝贵资料。本文将深入探讨…

C语言 | Leetcode C语言题解之第146题LRU缓存

题目&#xff1a; 题解&#xff1a; typedef struct {int key;int val;UT_hash_handle hh; } LRUCache;LRUCache* cache NULL; int g_capacity 0; LRUCache** lRUCacheCreate(int capacity) {g_capacity capacity;return &cache; }int lRUCacheGet(LRUCache** obj, int…

你对SSH协议了解吗

SSH&#xff08;Secure Shell&#xff09;协议&#xff0c;作为网络通信领域的一项核心技术&#xff0c;以其卓越的安全性能和广泛的应用范围&#xff0c;成为保障网络通信安全的重要工具。本文将深入剖析SSH协议的工作原理、核心特性以及在现代网络通信中的关键作用&#xff0…

一颗B+树可以存储多少数据?

一、前言 这个问题&#xff0c;非常经典&#xff0c;考察的点很多&#xff1a; 比如&#xff1a; 1、操作系统存储的单元&#xff0c;毕竟mysql也是运行在操作系统之上的应用。 2、B树是针对Mysql的InnoDB存储引擎&#xff0c;所以要理解InnoDb的最小存储单元&#xff0c;页&…

业务/吞吐量与存量数据设计关系+压测常见解决方案

前言 1、性能测试中业务量、吞吐量和存量数据的设计关系 1&#xff09;业务量 是不带时间单位。我们提到业务量的时候&#xff0c;一定会加一个时间单位。比如说&#xff0c;每天的业务量是 100 万笔&#xff0c;每年的业务量是 1 亿笔&#xff0c;等等。 2&#xff09;吞吐…

【电机驱动IC市场依旧火爆】

电机驱动IC&#xff08;集成电路&#xff09;是一种融合了CMOS控制电路和DMOS功率器件的芯片&#xff0c;它为核心的运动控制系统提供了完整的解决方案&#xff0c;包括与主处理器、电机和增量型编码器的无缝连接。电机驱动IC是现代电机控制系统的核心&#xff0c;它通过精确调…

Windows 安装 java 环境

搭建java开发环境 java的产品叫JDK&#xff08;java开发者工具包&#xff09;,必须安装JDK才能使用Java。 一、下载——java下载网址 二、安装 直接全部下一步就行&#xff0c;&#xff08;安装路径可以更换一下&#xff09;。 配置JAVA_HOME环境变量&#xff0c; 安装完成后…

【方法】如何隐藏和保护Excel表格中的敏感数据?

在工作中&#xff0c;很多人经常需要处理包含敏感信息的Excel表格。 为了确保这些数据的安全性&#xff0c;我们可以通过隐藏单元格、行和列&#xff0c;以及设置密码保护工作表的方法&#xff0c;来保护数据&#xff0c;下面一起来看看吧&#xff01; 一、隐藏数据&#xff1…

【免费API推荐】:为您的项目提供高质量的数据和功能(7)

开发者必备的免费实用类的API是现代开发领域中不可或缺的工具。这些API提供了各种功能和服务&#xff0c;能够帮助开发者快速构建强大、高效的应用程序。无论是地理位置服务、人脸识别、支付接口还是社交媒体集成&#xff0c;这些免费API为开发者提供了丰富的功能和数据&#x…

Exposure X7 Mac软件下载-Exposure X7 Mac正式版下载【照片编辑软件】附加详细安装步骤

Exposure X7 Mac正式版是款专门为Mac平台的用户打造的图像编辑工具。Exposure X7 Mac最新版提供了强大的色彩编辑器、自动调整、批量处理、一键预设、遮罩工具、无损层、人像修饰等等功能。并且Exposure X7 Mac还还结合了专业级的照片调整&#xff0c;在配合庞大的华丽照片外观…

MySql修改最大连接数

环境&#xff1a; mysql Ver 15.1 Distrib 5.5.x-MariaDB 1. 修改mysql最大连接数配置。 1.1. 永久修改最大连接数。 编辑配置文件/etc/my.cnf&#xff1a; vi /etc/my.cnf 在配置段[mysqld]中增加max_connections字段&#xff0c;配置最大连接数&#xff0c;如果配置段[my…

谷歌可穿戴设备与生成式AI模型PH-LLM:打造个性化健康监测与指导的新纪元

随着移动和可穿戴设备的普及&#xff0c;它们为个人健康监测提供了前所未有的机会&#xff0c;通过收集步数、心率变异性、睡眠持续时间等连续、精细和纵向数据&#xff0c;帮助用户实时跟踪自己的健康状况。这些数据不仅可以用于简单的监测&#xff0c;还可以结合生成式人工智…