C++学习 - 01(lambda 表达式)

提示:本博客作为学习笔记,有错误的地方希望指正。

文章目录

  • 一、概述
  • 二、基本语法
  • 三、示例
    • 3.1、不捕获任何外部变量
    • 3.2、 按值捕获外部变量
    • 3.3、按引用捕获外部变量
    • 3.4、捕获所有外部变量
    • 3.5、捕获 this 指针
  • 四、应用场景
    • 4.1、使用 Lambda 表达式作为线程函数

一、概述

  C++ 中的 lambda 表达式是一种内联定义的小型匿名函数,可以用于各种需要函数对象的场合。lambda 表达式提供了一种简洁的方式来定义和使用函数对象,特别适用于需要临时定义函数的情况,如回调函数、排序算法中的比较函数等。

二、基本语法

  lambda 表达式的基本语法如下:

[capture-list] (parameter-list) -> return-type { function-body }
  • capture-list:捕获列表,用于捕获外部变量。
  • parameter-list:参数列表,定义函数的参数。
  • return-type:返回类型,可选,如果省略,编译器会自动推断返回类型。
  • function-body:函数体,包含具体的逻辑。

捕获列表
  捕获列表用于将外部变量捕获到 lambda 表达式中。常见的捕获方式有:

  • []:不捕获任何外部变量。
  • [=]:按值捕获所有外部变量。
  • [&]:按引用捕获所有外部变量。
  • [var]:按值捕获特定变量 var。
  • [&var]:按引用捕获特定变量 var。
  • [this]:捕获当前对象的 this 指针。

三、示例

3.1、不捕获任何外部变量

  auto 关键字用于自动类型推断,可以简化变量声明和初始化的过程。auto 关键字告诉编译器根据初始化表达式来推断变量的类型。这不仅使代码更简洁,还减少了手动指定类型时可能出现的错误。

#include <iostream>
int main()
{auto lambda = []() {std::cout << "hello world" << std::endl;};lambda();   // 调用 lambda 表达式return 0;
}

3.2、 按值捕获外部变量

int main ()
{int value = 42;auto lambda = [value](){std::cout << "captured value : " << value << std::endl;};lambda();   // 调用 lambda 表达式return 0;
}

3.3、按引用捕获外部变量

#include <iostream>int main() {int value = 42;auto lambda = [&value]() {value += 10;std::cout << "Modified value: " << value << std::endl;};lambda(); // 调用 lambda 表达式std::cout << "Final value: " << value << std::endl;return 0;
}

3.4、捕获所有外部变量

#include <iostream>int main() {int value1 = 42;int value2 = 100;auto lambda = [=]() {std::cout << "Value1: " << value1 << ", Value2: " << value2 << std::endl;};lambda(); // 调用 lambda 表达式return 0;
}

3.5、捕获 this 指针


class Myclass
{public:int value;Myclass(int val) : value(val){}void printValue() {auto lambda = [this]() {std::cout << "Value : " << value << std::endl;};lambda();}
};int main()
{Myclass obj(42);obj.printValue();return 0;
}

四、应用场景

  • 回调函数
    在事件驱动编程中,lambda 表达式常用于定义回调函数。
  • 标准库算法:
    在使用标准库算法(如 std::sort、std::for_each 等)时,lambda 表达式可以作为比较函数或操作函数。
  • 线程函数:
    在多线程编程中,lambda 表达式可以作为线程函数。

4.1、使用 Lambda 表达式作为线程函数

#include <iostream>
#include <thread>void createThreadWithLambda() {int value = 42;// 定义一个 lambda 表达式作为线程函数auto threadFunction = [value]() {std::cout << "Thread function: Value = " << value << std::endl;};// 创建线程std::thread t(threadFunction);// 等待线程结束t.join();
}int main() {createThreadWithLambda();return 0;
}

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

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

相关文章

Linux性能优化之火焰图的起源

Linux火焰图的起源与性能优化专家 Brendan Gregg 密切相关&#xff0c;他在 2011 年首次提出这一工具&#xff0c;用于解决性能分析过程中可视化和数据解读的难题。 1. 背景&#xff1a;性能优化的需求 在现代计算中&#xff0c;性能优化往往需要对程序执行中的热点和瓶颈进行…

半桥驱动芯片调试中的问题

结论&#xff1a;低于12V的场景应用分立的MOS驱动电路压根不合适&#xff0c;选用集成桥臂的芯片合适。 HIN的输入电平不能是长时间的高电平&#xff0c;否则自举电容没法充放电从而没办法自举升压&#xff0c;上管无法控制&#xff1a; 电容C2的容值应该尽可能大&#xff…

【C++】类和对象-深度剖析默认成员函数-上

> &#x1f343; 本系列为初阶C的内容&#xff0c;如果感兴趣&#xff0c;欢迎订阅&#x1f6a9; > &#x1f38a;个人主页:[小编的个人主页])小编的个人主页 > &#x1f380; &#x1f389;欢迎大家点赞&#x1f44d;收藏⭐文章 > ✌️ &#x1f91e; &#x1…

RabbitMQ黑马笔记

目录 1.初识MQ 1.1.同步和异步通讯 1.1.1.同步通讯 1.1.2.异步通讯 1.2.技术对比&#xff1a; 2.快速入门 2.1.安装RabbitMQ 2.2.RabbitMQ消息模型 2.3.导入Demo工程 2.4.入门案例 2.4.1.publisher实现 2.4.2.consumer实现 2.5.总结 3.SpringAMQP 3.1.Basic Queu…

麒麟KylinServer的网站,并部署一套主从DNS服务器提供域名解析服务

一、KylinServer网站搭建 ifconfig Copy 注意:根据实际网卡设备名称情况调整代码!不同环境下网卡名称略有不同! 获取本机IP地址,记住IP地址用于之后的配置填写。 ifconfig enp0s2 Copy 下载nginx源码包,并解压缩 wget http://10.44.16.102:60000/allfiles/Kylin/ng…

解决IntelliJ IDEA的Plugins无法访问Marketplace去下载插件

勾选Auto-detect proxy setting并填入 https://plugins.jetbrains.com 代理URL&#xff0c;可以先做检查连接&#xff1a;

AWTK-WIDGET-WEB-VIEW 发布

awtk-widget-web-view 是通过 webview 提供的接口&#xff0c;实现的 AWTK 自定义控件&#xff0c;使得 AWTK 可以方便的显示 web 页面。 项目网址&#xff1a; https://gitee.com/zlgopen/awtk-widget-web-view webview 提供了一个跨平台的 webview 接口&#xff0c;是一个非…

Pandas教程之Pandas 简介

Pandas 简介 接下来一段时间&#xff0c;我会持续发布并完成Pandas教程 Pandas 是一个功能强大的开源 Python 库。Pandas 库用于数据操作和分析。Pandas 由数据结构和函数组成&#xff0c;可对数据执行有效的操作。 本免费教程将概述 Pandas&#xff0c;涵盖 Python Pandas 的基…

【linux】网络基础 ---- 数据链路层

用于两个设备(同一种数据链路节点)之间进行传递 数据链路层解决的问题是&#xff1a;直接相连的主机之间&#xff0c;进行数据交付 1. 认识以太网 "以太网" 不是一种具体的网络, 而是一种技术标准&#xff1a; 既包含了数据链路层的内容, 也包含了一些物理层的内容…

i春秋-FUZZ(python模板注入、base64编码命令执行)

练习平台地址 竞赛中心 题目描述 题目内容 很直接就是要fuzz参数 参数字典 dpaste/eH2Z1 (Plain Text) BP爆破参数 发现存在name参数 尝试sql注入 发现输入啥就回显啥&#xff0c;猜测是模板注入 测试是不是模板注入 虽然9*9没有被执行&#xff0c;但是config执行了&#…

另外一种缓冲式图片组件的用法

文章目录 1. 概念介绍2. 使用方法2.1 基本用法2.2 缓冲原理3. 示例代码4. 内容总结我们在上一章回中介绍了"FadeInImage组件"相关的内容,本章回中将介绍CachedNetworkImage组件.闲话休提,让我们一起Talk Flutter吧。 1. 概念介绍 我们在本章回中介绍的CachedNetwo…

Java中的CAS

目录 一.问题提出 1.1解决思路-锁 1.2解决思路-无锁 二.什么是CAS 三.CAS的特点 四.ABA问题 4.1解决方案-AtomicStampedReference 4.2解决方案-AtomicMarkableReference 一.问题提出 如何保证 withdraw 取款方法的线程安全 public class Cas {public static void mai…

git push时报错! [rejected] master -> master (fetch first)error: ...

错误描述&#xff1a;在我向远程仓库push代码时&#xff0c;即执行 git push origin master命令时发生的错误。直接上错误截图。 错误截图 错误原因&#xff1a; 在网上查了许多资料&#xff0c;是因为Git仓库中已经有一部分代码&#xff0c;它不允许你直接把你的代码覆盖上去…

药房智控:中药实验管理的自动化

6系统测试 6.1概念和意义 测试的定义&#xff1a;程序测试是为了发现错误而执行程序的过程。测试(Testing)的任务与目的可以描述为&#xff1a; 目的&#xff1a;发现程序的错误&#xff1b; 任务&#xff1a;通过在计算机上执行程序&#xff0c;暴露程序中潜在的错误。 另一个…

C语言实现数据结构之二叉树

文章目录 二叉树一. 树概念及结构1. 树的概念2. 树的相关概念3. 树的表示4. 树在实际中的运用&#xff08;表示文件系统的目录树结构&#xff09; 二. 二叉树概念及结构1. 概念2. 特殊的二叉树3. 二叉树的性质4. 二叉树的存储结构 三.二叉树链式结构的实现1. 前置说明2. 二叉树…

SpringCloud篇(服务保护 - Sentinel)

目录 一、雪崩问题及解决方案 1. 雪崩问题 2. 解决方案 方案一&#xff1a;超时处理 方案二&#xff1a;仓壁模式 方案三&#xff1a;断路器模式 方案四&#xff1a;限流 3. 总结 二、服务保护技术对比 三、Sentinel介绍与安装 1. 初识Sentinel 2. Sentinel 优势 3…

MCU的时钟体系

stm32F4的时钟体系图 1MHZ 10^6 HZ 系统时钟频率是168MHZ;AHB1、AHB2、AHB3总线上的时钟频率是168MHz;APB1总线上的时钟频率为42MHz&#xff1b;APB2总线上的时钟频率为84MHz&#xff1b; stm32F4的时钟体系图 在system_stm32f4xx.c文件中查看APB1和APB2的预分频值到底是多少…

Redis设计与实现 学习笔记 第十八章 发布与订阅

第18到24章是本书第四部分&#xff1a;独立功能的实现。 Redis的发布与订阅功能由PUBLISH、SUBSCRIBE、PSUBSCRIBE等命令组成。 通过执行SUBSCRIBE命令&#xff0c;客户端可订阅一个或多个频道&#xff0c;从而成为这些频道的订阅者&#xff08;subscriber&#xff09;&#…

小程序-基于java+SpringBoot+Vue的驾校预约平台设计与实现

项目运行 1.运行环境&#xff1a;最好是java jdk 1.8&#xff0c;我们在这个平台上运行的。其他版本理论上也可以。 2.IDE环境&#xff1a;IDEA&#xff0c;Eclipse,Myeclipse都可以。推荐IDEA; 3.tomcat环境&#xff1a;Tomcat 7.x,8.x,9.x版本均可 4.硬件环境&#xff1a…

python多版本管理 windows11 pyenv

前言 需要开发多个项目&#xff0c;但各个项目的版本不一致怎么办&#xff1f;python -m venv 只解决了依赖隔离问题&#xff0c;但venv本身并没有办法提供多个python版本。因此我们要引入pyenv来解决。 安装pyenv https://pyenv-win.github.io/pyenv-win/ 安装很简单&…