C++:Lambda表达式

C++:Lambda表达式

      • C++中`lambda`的基本语法
      • 1. 捕获列表(Capture List)
      • 2. 示例代码
        • 示例 1:简单的`lambda`
        • 示例 2:捕获变量
        • 示例 3:按引用捕获
        • 示例 4:捕获所有变量
        • 示例 5:作为函数参数
      • 3. `lambda`的高级特性
      • 4. 适用场景
      • 5. 注意事项
      • 总结


在C++中,lambda表达式是一种强大的特性,用于创建匿名函数对象。它从C++11标准开始引入,并在后续版本中不断完善。lambda表达式在C++中广泛应用于标准库算法(如std::sortstd::for_each等)以及其他需要函数对象的场景。

代码链接:https://gitee.com/hu_yuchen/C++11/lambda

C++中lambda的基本语法

C++的lambda表达式语法如下:

[capture](parameters) -> return_type { body }
  • capture:捕获列表,用于捕获当前作用域中的变量。
  • parameters:参数列表,类似于普通函数的参数。
  • -> return_type:返回类型(可选)。如果不指定,编译器会自动推导返回类型。
  • body:函数体,包含具体的逻辑。

1. 捕获列表(Capture List)

捕获列表用于将当前作用域中的变量捕获到lambda表达式中。捕获方式有以下几种:

  • 按值捕获:使用[x]捕获变量x的副本。
  • 按引用捕获:使用[&x]捕获变量x的引用。
  • 捕获所有变量:使用[=]按值捕获当前作用域中所有变量。
  • 捕获所有变量的引用:使用[&]按引用捕获当前作用域中所有变量。
  • 混合捕获:可以同时使用按值和按引用捕获,例如[x, &y]

2. 示例代码

以下是一些C++中lambda表达式的典型用法:

示例 1:简单的lambda
#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用 lambda 表达式作为回调函数std::for_each(vec.begin(), vec.end(), [](int x) {std::cout << x << " ";});std::cout << std::endl;return 0;
}

输出:

1 2 3 4 5
示例 2:捕获变量
#include <iostream>
#include <vector>
#include <algorithm>int main() {int factor = 2;std::vector<int> vec = {1, 2, 3, 4, 5};// 按值捕获变量 factorstd::for_each(vec.begin(), vec.end(), [factor](int x) {std::cout << x * factor << " ";});std::cout << std::endl;return 0;
}

输出:

2 4 6 8 10
示例 3:按引用捕获
#include <iostream>
#include <vector>
#include <algorithm>int main() {int factor = 2;std::vector<int> vec = {1, 2, 3, 4, 5};// 按引用捕获变量 factorstd::for_each(vec.begin(), vec.end(), [&factor](int x) {std::cout << x * factor << " ";factor++;  // 修改捕获的变量});std::cout << std::endl;std::cout << "Final value of factor: " << factor << std::endl;return 0;
}

输出:

2 6 12 20 30
Final value of factor: 7
示例 4:捕获所有变量
#include <iostream>
#include <vector>
#include <algorithm>int main() {int a = 2;int b = 3;// 捕获所有变量auto lambda = [=](){ return a * b; };std::cout << "Result: " << lambda() << std::endl;return 0;
}

输出:

Result: 6
示例 5:作为函数参数
#include <iostream>
#include <vector>
#include <algorithm>void processVector(const std::vector<int>& vec, void (*func)(int)) {for (int x : vec) {func(x);}
}int main() {std::vector<int> vec = {1, 2, 3, 4, 5};// 使用 lambda 表达式作为函数参数processVector(vec, [](int x) {std::cout << x * x << " ";});std::cout << std::endl;return 0;
}

输出:

1 4 9 16 25

3. lambda的高级特性

  • 可调用对象:lambda表达式本质上是一个可调用对象,可以赋值给std::function或其他支持函数调用的类型。
  • 默认捕获模式:可以指定默认捕获模式,例如[=, &x]表示按值捕获所有变量,但x按引用捕获。
  • mutable关键字:如果lambda需要修改捕获的变量,可以在lambda表达式中使用mutable关键字。
    auto lambda = [x = 5]() mutable { x++; std::cout << x << std::endl; };
    lambda();  // 输出 6
    

4. 适用场景

  • 标准库算法:如std::sortstd::for_eachstd::transform等,lambda表达式可以作为回调函数传递。
  • 线程创建:在std::thread中,可以使用lambda表达式作为线程函数。
  • 事件处理:在GUI编程或事件驱动的场景中,lambda表达式可以作为事件处理器。
  • 简化代码:对于简单的函数逻辑,lambda可以减少代码量,使代码更简洁。

5. 注意事项

  • 捕获变量的生命周期:如果捕获了局部变量的引用,需要确保lambda表达式在变量生命周期内使用,否则可能导致未定义行为。
  • 性能开销:虽然lambda表达式通常不会引入额外的性能开销,但捕获大量变量可能会增加内存使用。
  • 复杂逻辑:对于复杂的逻辑,建议使用普通函数而不是lambda表达式,以提高代码的可读性。

总结

C++中的lambda表达式是一种非常灵活和强大的特性,适用于需要简单函数对象的场景。通过合理使用捕获列表和参数列表,可以实现简洁高效的代码。

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

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

相关文章

被关在idea小黑屏里写spark程序

一、先在idea中添加Scala插件 二、使用Maven创建新项目 1.启动idea,选择新建项目。之后的设置如下&#xff1a; 2.将Scala添加到全局库中&#xff08;注意&#xff1a;Scala的版本不宜太高&#xff0c;最好是2-12.否则后面会报下面这个错误 E:\tool接口\SparkCore_01\src\mai…

自动化立库/AGV物流仿真详细步骤

以下是一种可以在预算和周期内实现自动化立库及AGV 方案仿真分析的方法&#xff1a; 一、工具选择 软件工具FlexSim&#xff1a;这是一款流行的离散事件仿真软件。它具有直观的图形用户界面&#xff0c;通过简单的拖拽操作就可以构建自动化立库和 AGV 的模型。其内置的丰富的…

使用springboot+easyexcel实现导出excel并合并指定单元格

1&#xff1a;准备一个单元格合并策略类代码&#xff1a; import com.alibaba.excel.metadata.Head; import com.alibaba.excel.metadata.data.WriteCellData; import com.alibaba.excel.write.handler.CellWriteHandler; import com.alibaba.excel.write.metadata.holder.Writ…

Python三大Web框架对比:Django、Flask、Tornado的异步实现方式详解

目录 引言 一、框架基础概览 1.1 Django 1.2 Flask 1.3 Tornado 二、异步编程基础 2.1 同步 vs 异步 2.2 Python异步演进 三、框架异步实现对比 3.1 Django的异步进化 3.2 Flask的异步扩展 3.3 Tornado的异步范式 四、异步实现差异对比 4.1 实现机制对比 4.2 性…

深入理解Spring AI框架的核心概念

深入理解Spring AI框架的核心概念 前言 在当今人工智能飞速发展的时代&#xff0c;将AI技术集成到应用程序中已成为众多开发者关注的焦点。Spring AI框架为Java开发者提供了便捷的途径来实现这一目标。理解其核心概念对于充分发挥框架的潜力至关重要。本文将详细探讨Spring A…

LabVIEW基于VI Server的控件引用操作

本 VI 通过展示控件引用&#xff08;Control References&#xff09;的使用&#xff0c;借助 VI Server 实现对前面板对象的编程操作。 ​ 详细说明 隐式属性节点&#xff08;Implicitly Linked Property Node&#xff09;&#xff1a;通过右键单击控件&#xff08;或其控件终…

AI 边缘计算网关十大品牌

引言 在物联网与人工智能技术飞速发展的当下&#xff0c;数据量呈爆发式增长&#xff0c;对数据处理的实时性、准确性和安全性要求不断提高。AI边缘计算网关应运而生&#xff0c;它融合了人工智能、边缘计算与物联网技术&#xff0c;在靠近数据源或物理设备的网络边缘侧&#…

基于深度学习的视频目标跟踪算法研究

标题:基于深度学习的视频目标跟踪算法研究 内容:1.摘要 随着视频数据的爆炸式增长&#xff0c;视频目标跟踪在智能监控、自动驾驶、人机交互等领域有着广泛的应用需求。本文的目的是研究基于深度学习的视频目标跟踪算法&#xff0c;以提高跟踪的准确性和实时性。方法上&#x…

C++代码随想录刷题知识分享-----面试题链表相交

一、题目要求 题目&#xff1a;给定两条单链表 headA、headB&#xff0c;找出它们相交的起始节点&#xff08;节点对象相同而非数值相等&#xff09;。若无交点返回 null。 限制&#xff1a;链表无环&#xff1b;函数返回后链表结构不能被破坏。 图示两个链表在节点 c1 开始相…

修改输入框选择框颜色

项目场景&#xff1a; 提示&#xff1a;这里简述项目相关背景&#xff1a; 有时候需要改写element原来输入框/选择框的颜色 问题描述 提示&#xff1a;这里描述项目中遇到的问题&#xff1a; 输入框的话需要hover时边框颜色修改&#xff0c;选择值的时候边框颜色修改以及选…

8.学习笔记-Maven进阶(P82-P89)

&#xff08;一&#xff09;Maven-08-配置文件加载属性 通过maven可以做版本的集中管理&#xff0c;所以能不能通过maven进行配置文件&#xff08;jdbc.properties&#xff09;的集中管理。 &#xff08;1&#xff09;resource-》jdbc.properties 可以识别$符号 因为只能…

基于Springboot+Mysql的汉服推广网站(含LW+PPT+源码+系统演示视频+安装说明)

系统功能 管理员功能&#xff1a;首页、个人中心、汉服知识管理、服装展示管理、服装类别管理、用户相册管理、论坛交流、系统管理、订单管理&#xff1b;用户功能&#xff1a;首页、个人中心、用户相册管理、论坛交流、我的收藏管理、订单管理。 作者&#xff1a;计算机搬砖家…

Missashe考研日记-day30

Missashe考研日记-day30 0 写在前面 日记也是写到第30篇了哈哈&#xff0c;满月了&#xff0c;虽然过了不止30天中间有断更&#xff0c;但还是表扬一下自己坚持下来了。&#xff1a;&#xff09; 1 专业课408 学习时间&#xff1a;2h30min学习内容&#xff1a; 今天有其他事…

HHsuite同源序列搜索数据库构建

HHsuite 可用的数据库格式简介 HHsuite 是用于蛋白质序列比对和同源性检测的工具套件,它使用特定的数据库格式以实现高效的数据存储和快速的检索。HHsuite 常用的数据库格式主要基于 FFINDEX(Flat-File Index),这是一种简单而高效的文件索引系统,它将数据文件(如蛋白质序…

基于HTML CANVAS和EXCEL的xlsx文件展示工具websheet

什么是WEBSHEET websheet基于HTML5的CANVAS和JAVASCRIPT开发的纯前端xlsx文件展示控件&#xff0c;该控件着重的页面展示&#xff0c;主要完成了文件导入、导出、文本展示、格式化文本、合并单元格、边框、底色、设置行列宽度高度&#xff0c;行列隐藏、视图锁定、基础表格、撤…

Android Studio for Platform(ASFP)真机调试

连接设备 由于ubuntu连接adb设备每次都需要配置usb权限&#xff0c;很麻烦。并且每次换设备还要重新配置&#xff0c;我多数设备都是用wifi的adb方式连接。 开发板显示 连接显示器配合usb鼠标或者遥控器操作&#xff08;因为开发板默认开启了adb&#xff0c;我这里是使用有线…

基于springboot+vue的健康健身追踪系统

开发语言&#xff1a;Java框架&#xff1a;springbootJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;Maven3.3.9 系统展示 用户信息管理 健…

Ubuntu下安装vsode+qt搭建开发框架(一)

Ubuntu下安装vsode+qt搭建开发框架(一) g++的编译环境,这里不介绍,可点击这里查看 查看一下当前的g++环境 g++ --version g++ (Ubuntu 11.4.0-1ubuntu1~22.04) 11.4.0 Copyright (C) 2021 Free Software Foundation, Inc. This is free software; see the source for copyin…

php 需要学会哪些技术栈,掌握哪些框架

作为一个「野生」程序员&#xff0c;我的学习过程比较急功近利。 我记得自己写的第一个 PHP 程序是留言本。一上来对 PHP 一窍不通&#xff0c;所以直接去网上找了个留言本的源码&#xff0c;下载下来后先想办法让它在自己电脑上运行起来。通过这个过程掌握了 PHP 开发环境的搭…

近期实践总结

一、计算机二级考试到底教会了我们什么&#xff1f; 1、概况 根据本人复习、考试的经验&#xff0c;不难发现里面的试题或多或少有些死板&#xff08;甚至可以说落后于时代&#xff09;&#xff0c;当今时代已经不是二十年前什么都需要手搓的时代了&#xff0c;引擎、集成类软…