C++11 lambda

news2025/2/24 6:53:55

 Lambda 介绍

   Lambda 函数也叫匿名函数, 是C++ 11中新增的特性;

1. Lambda函数的好处

 如果你的代码里面存在大量的小函数,而这些函数一般只被调用一次,那么将他们重构成 lambda 表达式。

Lambda函数使代码变得更加紧凑、更加结构化和更富有表现力;

lambda在c++作用主要是作为内嵌函数,逻辑更加清楚,代码可读性更好;

例:

void main()
{
	thread t1([]() { 
		printf("hello..."); 
	});
	t1.join();
 
}

2. C++11 的 lambda 表达式规范如下:

此图显示了 lambda 的组成部分:

  1. capture 子句(在 C++ 规范中也称为 Lambda 引导。)

  2. 参数列表(可选)。 (也称为 Lambda 声明符)

  3. mutable 规范(可选)。

  4. exception-specification(可选)。

  5. trailing-return-type(可选)。

  6. Lambda 体。

具体见:

C++ 中的 Lambda 表达式 | Microsoft Learn

Lambda 表达式的定义形式如下:

[外部变量访问方式说明符] (参数表) -> 返回值类型
{
   语句块
}

 example

[=] (int x, int y) -> bool {return x%10 < y%10; }

Lambda捕获列表

Lambda表达式与普通函数最大的区别是,除了可以使用参数以外,Lambda函数还可以通过捕获列表访问一些上下文中的数据;

语法上,在“[]”包括起来的是捕获列表

捕获列表由多个捕获项组成,并以逗号分隔。捕获列表有以下几种形式:

[]表示不捕获任何变量

[var]表示值传递方式捕获变量var

int num = 100;
auto function = ([num]{
		std::cout << num << std::endl;
	}
);

 [&var]表示引用传递捕捉变量var  (可修改值)

[=]表示值传递方式捕获所有父作用域的变量(包括this

[=, &a, &b]表示以引用传递的方式捕捉变量ab,以值传递方式捕捉其它所有变量

[&, a, this]表示以值传递的方式捕捉变量athis,引用传递方式捕捉其它所有变量。

不过值得注意的是,捕捉列表不允许变量重复传递。下面一些例子就是典型的重复,会导致编译时期的错误。例如:

    [=,a]这里已经以值传递方式捕捉了所有变量,但是重复捕捉a了,会报错的;
    [&,&this]这里&已经以引用传递方式捕捉了所有变量,再捕捉this也是一种重复。

Lambda参数列表

Lambda还可以接受输入参数。参数列表是可选的, 类似于函数的参数列表

auto function = [] (int a, int b){
    return a+ b;
};
	
function(100, 200);

可变规格mutable

默认情况下Lambda函数总是一个const函数,mutable可以取消其常量性。在使用该修饰符时,参数列表不可省略(即使参数为空)。

#include <iostream>
using namespace std;

int main()
{
   int m = 5;
   [&] (int a) mutable { m += a; }(6);   // a=6;
   cout << m     << endl;
}

输出 11;

返回类型

Lambda表达式的返回类型会自动推导。除非你指定了返回类型,否则不必使用关键字

auto x1 = [](int i){ return i; };

Lambda表达式的缺点

  • Lamdba表达式语法比较灵活,增加了阅读代码的难度
  • 对于函数复用无能为力

Lamdba 表达式应用于STL算法库 

#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
    int a[4] = { 1, 2, 3, 4 };
    int total = 0;
    for_each(a, a + 4, [&](int & x) { total += x; cout << total << endl; });
    cout << total << endl;  //输出 10
   
    return 0;
}

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

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

相关文章

解决gocui库的中文显示缺少的bug

gocui库地址 https://github.com/jroimartin/gocui 使用原由 最近写文档都用emacs&#xff0c;git客户端用的是magit。 但是写代码现在都用lvim&#xff0c;在lvim和终端下喜欢上了使用lazygit做git客户端。 非常喜欢lazygit在终端上的界面&#xff0c;扒拉了下github上代码…

【最优化理论】线性规划

文章目录什么是线性规划&#xff08;Linear Programming&#xff0c;LP&#xff09;&#xff1f;线性规划的标准形式非标准形LP模型转化为标准形LP模型基本概念基本解&基矩阵&基变量&非基变量基本可行解&可行基矩阵&非退化的基本可行解&退化的基本可行…

「JVM 执行引擎」栈架构的字节码的解释执行引擎

JVM 执行引擎在执行 Java 代码时有解释执行&#xff08;通过解释器执行&#xff09;和编译执行&#xff08;通过即时编译器产生本地代码执行&#xff09;两种选择&#xff1b; HotSpot 实际的实现中&#xff0c;模版解释器工作时&#xff0c;并不是按照概念模型中进行机械式计…

虹科分享 | CANopen协议基础知识——LSS服务

CANopen是一种架构在CAN串行总线系统上的高层通讯协议&#xff0c;常被用于嵌入式系统与工业控制领域&#xff0c;包括电机控制、机器人制造、医疗、汽车等多个行业领域。本篇文章将主要介绍CANopen的LSS服务。 一. LSS概述 Layer setting service (LSS)是CANopen的设置服务与…

Self-Supervised Log Parsing 自监督日志解析

摘要 日志在软件系统的开发和维护过程中被广泛使用&#xff0c;收集运行时事件并允许跟踪代码执行&#xff0c;从而支持各种关键任务&#xff0c;如故障排除和故障检测。大型软件系统会生成大量的半结构化日志记录&#xff0c;这对自动化分析提出了重大挑战。将带有自由形式文…

网站代理是什么?有什么需要注意的?

如今&#xff0c;网站代理已经成为一种不可或缺的经营方式。无论是企业还是个人&#xff0c;都需要通过代理来获得更多的流量和市场份额。 一、网站代理的优势 网站代理的优势在于能够为您提供更加专业、周到的服务。这些优势包括&#xff1a;1.丰富的内容资源&#xff0c;能…

2022年FIT2CLOUD飞致云开源成绩单

2023年2月15日&#xff0c;中国领先的开源软件公司FIT2CLOUD飞致云发布《2022年开源成绩单》&#xff0c;盘点公司2022年全年在开源软件产品与社区运营方面的表现。目前&#xff0c;飞致云旗下的核心开源软件组合包括JumpServer开源堡垒机、DataEase开源数据可视化分析平台、Me…

高压放大器在骨的逆力电研究中的应用

实验名称&#xff1a;高压放大器在骨的逆力电研究中的应用研究方向&#xff1a;生物医学测试目的&#xff1a;骨中的胶原和羟基磷灰石沿厚度分布不均匀&#xff0c;骨试样在直流电压作用下&#xff0c;内部出现传导电流引起试样内部温度升高&#xff0c;不同组分热变形不一致&a…

python3.7

一、下载安装ancconda(python3.7) ​​​​​​https://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2019.07-Windows-x86.exehttps://mirrors.tuna.tsinghua.edu.cn/anaconda/archive/Anaconda3-2019.07-Windows-x86.exe 二、配制Anaconda环境变量 此电脑——…

国外ChatGPT横空出世,国内无代码开发一样惊人,旗鼓相当

ChatGPT火爆了&#xff0c;究竟是什么&#xff1f; 有些人以为ChatGPT&#xff0c;只是更先进的人工智能聊天工具罢了。它除了能学习与理解人类对话语言&#xff0c;还能结合下文“思考”&#xff0c;实现与人类正常交流。这款由美国OpenAI研发的人工智能技术&#xff0c;2022年…

珠宝企业如何利用私域实现业绩增长?

近年来私域的流量不断兴起&#xff0c;各行业都在做私域&#xff0c;所处行业不同&#xff0c;企业所采取的私域打法也会针对性地改变。而在珠宝行业&#xff0c;针对珠宝产品高价、低频的消费特点&#xff0c;企业又该如何搭建私域应对策略&#xff1f; 快鲸scrm系统整理了几…

仓库管理软件(WMS)免费版哪个好用?

现在很少有软件会支持白嫖了&#xff0c;尤其是仓库管理这么重要单元。 但是对于刚刚起步的公司&#xff0c;企业面临着资金紧缺、人力资源不足等诸多管理问题。这时候大部分中小企业都会选择仓库管理软件系统来满足仓库管理的需求。 那么免费仓库管理软件有哪些&#xff1f;…

MySQL B+树以及深度计算

文章目录一、MySQL的索引结构1.1 MySQL索引结构与B树1.2 B树增删数据图解二、MySQL数据页2.1 索引高度h与页面I/O数的关系2.2 索引高度理论计算三、查看MySQL树高一、MySQL的索引结构 1.1 MySQL索引结构与B树 MySQL使用B树存储索引数据&#xff0c;B树的非叶节点不保存数据相关…

卫星、无人机平台的多光谱数据在地质、土壤调查和农业等需要用什么?

近年来&#xff0c;Python编程语言受到越来越多科研人员的喜爱&#xff0c;在多个编程语言排行榜中持续夺冠。同时&#xff0c;伴随着深度学习的快速发展&#xff0c;人工智能技术在各个领域中的应用越来越广泛。机器学习是人工智能的基础&#xff0c;因此&#xff0c;掌握常用…

造血干细胞移植中心的设计SICOLAB

造血干细胞移植中心的设计通常需要考虑以下方面&#xff1a;一、设备和设施包括具备灭菌条件的手术室、空气净化设备、输液泵、监测仪器等。二、空间规划需要根据手术流程和治疗流程合理划分空间&#xff0c;确保空间充足且方便患者活动。1、患者治疗区&#xff1a;包括隔离病房…

【C++】二叉树的非递归遍历

非递归遍历二叉树一、二叉树的前序遍历二、二叉树的中序遍历三、二叉树的后序遍历3.1 方法一3.2 方法二一、二叉树的前序遍历 题目链接 我们可以把任何一棵树看成左路节点&#xff0c;左路节点和右子树。先访问左路节点&#xff0c;再访问左路节点的右子树。在右子树中也重复这…

3. 编码风格

学习的动力不止于此&#xff1a; 谷歌c编码风格指南 学习它就是强&#xff0c;没别的。方便查bug&#xff01; 1.注释说明 //copyright 2023 songshuaibiancheng Inc //License(BSD/GPL/...) //Author: songshu //This is a c style guide/* 版权 许可证 作者 文件内容简短…

字节5年老测试,2月无情被辞。业务与技术你要理解的概念!

前言近年来企业对于员工的要求不再满足于简单的处理工作&#xff0c;除了KPI考核&#xff0c;越来越多的公司会对思考力、理解力进行更深层次的综合评估&#xff0c;对于精准人才的筛选大搞特搞“末位淘汰制”。一个在大厂工作认识几年的朋友跟我说&#xff0c;单一的能力很难受…

Gorm -- 配置连接、Gorm模型及Tag描述

文章目录引入依赖读取配置文件配置数据库连接池定义模型数据库表信息创建对应结构体数据模型中字段的标签属性columnserializerprimaryKeydefaultautoIncrement / AUTO_INCREMENTembedded / embeddedPrefixautoCreateTimeautoUpdateTime-foreignKey / references引入依赖 go g…

Tesseract OCR与文本智能识别

博主简介 博主是一名大二学生&#xff0c;主攻人工智能研究。感谢让我们在CSDN相遇&#xff0c;博主致力于在这里分享关于人工智能&#xff0c;c&#xff0c;Python&#xff0c;爬虫等方面知识的分享。 如果有需要的小伙伴可以关注博主&#xff0c;博主会继续更新的&#xff0c…