C++11——lambda

news2024/11/23 11:55:20

lambda

    • lambda的介绍
    • lambda的使用
    • lambda的细节->捕捉列表

lambda的介绍

lambda是匿名函数,再适合的场景去使用可以提高代码的可读性。
场景:
假设有一个Goods类需要进行按照价格、数量排序

class Goods
{
	string name;
	size_t _price;//价格
	int num;//数量
};

要是对一个类进行排序可以使用库函数sort(),但是sort()的最后一个参数是决定按照哪个成员排序,以及是排升序还是排降序的,所以最后一个参数就需要写成仿函数,假设用价格排升序:

struct ComparePriceGreater
{
	bool operator()(Goods& g1,Goods& g2)
	{
		return g1.price>g2.prices;
	}
};
//然后再传仿函数
sort(容器.begin(),容器.end(),ComparePriceGreater())

这样排列组合就需要写四个仿函数那这样就会减低代码的可读性,如果使用lambda就可以减少代码量,加强代码的可读性。

sort(容器.begin(),容器.end(),[](const Goods& g1, const Goods& g2)
{return g1.price>g2.price };)

lambda的使用

lambdad的组成部分:capture-listmutable->return-type{statement}
[capture-list]:叫做补做列表,该列表总是出现在lambda函数的开始位置,编译器根据[]来判断接下来的代码是否为lambda函数,捕捉列表能够捕捉上下文中的变量供lambda函数使用。
(parameters):叫做参数列表,和函数的参数列表是一样的,没有参数的时候可以省略
mutable:默认情况下,lambda函数总是一个const函数,mutable可以取消其常量性。使用该修饰符时,参数列表不可省略(即使参数为空)。
->return-type:返回值类型。用追踪返回类型形式声明函数的返回值类型,没有返回值时此部分可以省略。返回值类型明确情况下,也可省略,由编译器对返回类型进行推导。
{statement}:函数主体,在该函数体内,除了可以使用其参数外,还可以使用所有捕获到的变量。

int main()
{
	auto add = [](int a)mutable->int {return ++a; };
	cout << add(1) << endl;
	return 0;
}

需要注意:函数体写完之后要加上;

lambda的细节->捕捉列表

[]捕捉列表可以捕捉程序上下文中的变量给函数体使用,是值传递还是应用传递。
[var]:值传递捕捉var
[=]:值传递捕捉此作用域中的所有变量
[&var]:引用传递捕捉var
[&]:引用传递捕捉此作用域中的全部变量
[this]:值传递捕捉this指针
注意点:

  • 捕捉传递可以是多个捕捉项,如:[=,&a,&b]
  • 不能重复传递捕捉同一个变量,如:[=,a]
  • lambda是一个匿名函数,要用auto来接收,或者function和bind包装器
  • lambda若是全局的,捕捉列表一定要为空
  • 两个相同的lambda不可以赋值
  • lambda只可以捕捉本作用域的局部变量,捕捉全局和非此作用域的变量会报错

例子: 写一个交换两个数的lambda

int main()
{
	int a = 1;
	int b = 2;
	auto Swap = [=]() mutable
	{
			int tmp = a;
			a = b;
			b = tmp;
	};
	Swap();
	cout << a << " " << b << endl;
	return 0;
}

在这里插入图片描述

这里是=捕捉属于值传递给函数体,说明实际是交换不了a和b的,mutable,是为了解除捕捉过来的a,b的const属性。

int a = 1;
int b = 2;
auto Swap = [&]() mutable
	{
		int tmp = a;
		a = b;
		b = tmp;
	};
Swap();
cout << a << " " << b << endl;
return 0;

在这里插入图片描述
这里是&捕捉给函数体使用是引用传递,可以交换a,b的值,这里可以不加mutable,因为引用类似于指针,初始是不带const属性的。

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

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

相关文章

大模型推理性能优化

LLM 推理的核心指标 首 Token 延迟(决定了用户体验) 延迟:从输入到输出最后一个 token 的延迟 吞吐量:每秒针对所有请求生成的 token 数(针对所有并发请求) 推理的性能卡点 1. KV-Cache 大小导致并发能力受限 LLM推理的过程是一个自回归的过程,前 i 次的token会作为…

秒懂Linux之共享内存

目录 共享内存概念 模拟实现共享内存 创建key阶段 ​编辑创建共享内存阶段 删除共享内存阶段 查看共享内存属性阶段 挂接共享内存到进程阶段 取消共享内存与进程挂接阶段 进程通信阶段 添加管道改进版 共享内存函数 shmget函数 shmat函数 shmdt函数 shmctl函数 共享内存概念 共…

第二十一节:学习Redis缓存数据库的Hash操作(自学Spring boot 3.x的第五天)

这节记录下Redis的Hash操作。主要是opsForHash方式和boundHashOps方式。 boundHashOps和opsForHash都是Spring Data Redis中用于操作Redis哈希数据结构的方法&#xff0c;但它们在使用方式和场景上存在一些区别。 boundHashOps 使用方式&#xff1a; boundHashOps方法通过Redi…

【第十三章:Sentosa_DSML社区版-机器学习聚类】

目录 【第十三章&#xff1a;Sentosa_DSML社区版-机器学习聚类】 13.1 KMeans聚类 13.2 二分KMeans聚类 13.3 高斯混合聚类 13.4 模糊C均值聚类 13.5 Canopy聚类 13.6 Canopy-KMeans聚类 13.7 文档主题生成模型聚类 13.8 谱聚类 【第十三章&#xff1a;Sentosa_DSML社…

C#基于SkiaSharp实现印章管理(8)

上一章虽然增加了按路径绘制文本&#xff0c;支持按矩形、圆形、椭圆等路径&#xff0c;但测试时发现通过调整尺寸、偏移量等方式不是很好控制文本的位置。相对而言&#xff0c;使用弧线路径&#xff0c;通过弧线起始角度及弧线角度控制文本位置更简单。同时基于路径绘制文本时…

Chainlit集成LlamaIndex实现知识库高级检索(简单融合寻回器)

检索原理 ** 简单融合寻回器 ** 简单融合寻回原理&#xff0c;是利用多个检索器&#xff0c;融合查询最终的结果返回给LLM。此检索器还将通过生成与原始问题相关的问题&#xff0c;用相关问题再次检索多个检索器的数据&#xff0c;把原始问题和相关问题经过多个检索器检索结果…

Relations Prediction for Knowledge Graph Completion using Large Language Models

文章目录 题目摘要简介相关工作方法论实验结论局限性未来工作 题目 使用大型语言模型进行知识图谱补全的关系预测 论文地址&#xff1a;https://arxiv.org/pdf/2405.02738 项目地址&#xff1a; https://github.com/yao8839836/kg-llm 摘要 知识图谱已被广泛用于以结构化格式表…

高级java每日一道面试题-2024年9月20日-分布式篇-什么是CAP理论?

如果有遗漏,评论区告诉我进行补充 面试官: 什么是CAP理论&#xff1f; 我回答: 在Java高级面试中&#xff0c;CAP理论是一个经常被提及的重要概念&#xff0c;它对于理解分布式系统的设计和优化至关重要。CAP理论是分布式系统理论中的一个重要概念&#xff0c;它描述了一个分…

【数学分析笔记】第3章第2节 连续函数(4)

3. 函数极限与连续函数 3.2 连续函数 3.2.9 反函数的连续性定理 【定理3.2.2】【反函数连续性定理】设 y f ( x ) yf(x) yf(x)在闭区间 [ a , b ] [a,b] [a,b]上连续且严格单调增加&#xff0c;设 f ( a ) α , f ( b ) β f(a)\alpha,f(b)\beta f(a)α,f(b)β&#xff0…

仓颉编程入门

#体验华为仓颉编程语言# 仓颉发布的第一时间&#xff0c;就申请了测试。昨天发现申请通过 &#xff0c;果断下载SDK体验一下。 废话不多说&#xff0c;从下载完开始&#xff0c;下面这个图&#xff0c;就是下载的文件&#xff1a; 看文件夹样子跟c/c套路差不多。bin目录是cjc…

linux安装nginx+前端部署vue项目(实际测试react项目也可以)

&#x1f9f8;本篇博客作者测试上线过不下5个项目&#xff0c;包括单纯的静态资源&#xff0c;vue项目和react项目&#xff0c;包好用&#xff0c;请放心使用 &#x1f4dc;作者首页&#xff1a;dream_ready-CSDN博客 &#x1f4dc;有任何问题都可以评论留言&#xff0c;作者将…

什么是大模型的泛化能力?

大模型的泛化能力指的是模型在未见过的数据上表现的能力&#xff0c;即模型不仅能在训练数据上表现良好&#xff0c;也能在新的、未知的数据集上保持良好的性能。这种能力是衡量机器学习模型优劣的重要指标之一。 泛化能力的好处包括但不限于&#xff1a; 提高模型的适应性&a…

基于uniapp的民宿酒店预订系统(后台+小程序)

&#x1f497;博主介绍&#x1f497;&#xff1a;✌在职Java研发工程师、专注于程序设计、源码分享、技术交流、专注于Java技术领域和毕业设计✌ 温馨提示&#xff1a;文末有 CSDN 平台官方提供的老师 Wechat / QQ 名片 :) Java精品实战案例《700套》 2025最新毕业设计选题推荐…

F28335中断系统

1 中断介绍 1.1 中断概念 1.2 TMS320F28335 中断概述

CUDA并行架构

一、CUDA简介 CUDA(Compute Unified Device Architecture)是一种由NVIDIA推出的通用并行计算架构&#xff0c;该架构使GPU(Graphics Processing Unit)能够对复杂的计算问题做性能速度优化。 二、串并行模式 高性能计算的关键是利用多核处理器进行并行计算。 串行模式&#…

使用LangGPT提示词让大模型比较浮点数

使用LangGPT提示词让大模型比较浮点数 背景介绍环境准备创建虚拟环境安装一些必要的库安装其他依赖部署大模型启动图形交互服务设置提示词与测试 LangGPT结构化提示词 背景介绍 LLM在对比浮点数字时表现不佳&#xff0c;经验证&#xff0c;internlm2-chat-1.8b (internlm2-cha…

Excel-时间取整,工作有效时长计算

在计算考勤时&#xff0c;打卡时间不是整点&#xff0c;上班时间是遵循整点开始计算的&#xff0c;员工提前打卡&#xff0c;所以要用到时间向上取整。 上班取整&#xff1a; 使用CEILING函数可实现该需求&#xff0c;参考以下公式&#xff0c;第一个参数为上班打卡时间&#…

MySQL篇(窗口函数/公用表达式(CTE))(持续更新迭代)

目录 讲解一&#xff1a;窗口函数 一、简介 二、常见操作 1. sumgroup by常规的聚合函数操作 2. sum窗口函数的聚合操作 三、基本语法 1. Function(arg1,..., argn) 1.1. 聚合函数 sum函数&#xff1a;求和 min函数 &#xff1a;最小值 1.2. 排序函数 1.3. 跨行函数…

一文读懂SpringCLoud

一、前言 只有光头才能变强 认识我的朋友可能都知道我这阵子去实习啦&#xff0c;去的公司说是用SpringCloud(但我觉得使用的力度并不大啊~~)… 所以&#xff0c;这篇主要来讲讲SpringCloud的一些基础的知识。(我就是现学现卖了&#xff0c;主要当做我学习SpringCloud的笔记吧&…

英集芯IP5902:集成电压可调异步升压转换充电管理功能的8位MCU芯片

英集芯IP5902是一款集成了9V异步升压转换、锂电池充电管理及负端NMOS管的8-bit MCU芯片&#xff0c;外壳采用了SOP16封装形式&#xff0c;高集成度和丰富的功能使其在应用时只需很少的外围器件&#xff0c;就能有效减小整体方案的尺寸&#xff0c;降低BOM成本&#xff0c;为小型…