探索C++新特性:深入理解Lambda表达式

C++不断演进,引入了新的特性和改进,使得语言更强大、更具表达力。其中,C++11引入的Lambda表达式是最具影响力的特性之一。这个特性将匿名函数的能力带入C++,允许开发者编写更简洁和清晰的代码。在这篇博客中,我们将探索C++中的Lambda表达式概念,提供示例,并看看它们如何在实际场景中有效使用。

什么是Lambda表达式?

Lambda表达式是一种在代码中直接定义匿名函数对象(functors)的方法。它们可以捕获来自周围作用域的变量,并可以在需要函数对象的任何地方使用。Lambda表达式的语法如下:

[capture](parameters) -> return_type {// 函数体
}
  • capture:捕获列表,用于指定在Lambda表达式中可以使用的外部变量。
  • parameters:参数列表,类似于普通函数的参数列表。
  • return_type(可选):返回类型,可以省略,编译器会自动推断。
  • function body:函数体,包含要执行的代码。
Lambda表达式的基本使用

让我们从一个简单的例子开始,展示如何使用Lambda表达式:

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {1, 2, 3, 4, 5};// 使用Lambda表达式打印所有数字std::for_each(numbers.begin(), numbers.end(), [](int n) {std::cout << n << " ";});std::cout << std::endl;return 0;
}

在这个例子中,std::for_each 函数接受一个范围和一个函数对象。我们通过Lambda表达式定义了一个匿名函数,该函数接收一个整数参数并将其打印。

捕获列表的使用

捕获列表允许Lambda表达式访问和使用周围作用域中的变量。捕获列表可以按值捕获或按引用捕获:

  • 按值捕获

int a = 10;
auto lambda = [a]() { return a; };

 在这种情况下,a 被按值捕获,Lambda表达式内部使用的是 a 的副本。

  • 按引用捕获

int a = 10;
auto lambda = [&a]() { return a; };

在这种情况下,a 被按引用捕获,Lambda表达式内部使用的是原变量 a

示例:捕获外部变量

以下是一个捕获外部变量的示例:

#include <iostream>int main() {int x = 10;int y = 20;auto add = [x, &y]() -> int {y += x;return y;};std::cout << "Result: " << add() << std::endl; // 输出结果:30std::cout << "y: " << y << std::endl; // 输出结果:30return 0;
}

在这个例子中,x 被按值捕获,而 y 被按引用捕获。因此,调用 add 后,y 的值发生了变化,而 x 仍然保持不变。

在标准库算法中的应用

Lambda表达式在标准库算法中非常有用。例如,在排序算法中使用自定义比较函数:

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> numbers = {5, 2, 8, 1, 3};// 使用Lambda表达式进行降序排序std::sort(numbers.begin(), numbers.end(), [](int a, int b) {return a > b;});for (int n : numbers) {std::cout << n << " ";}std::cout << std::endl;return 0;
}

在这个例子中,我们使用Lambda表达式定义了一个比较函数,用于对 numbers 向量进行降序排序。

自定义哈希函数

Lambda表达式还可以用于定义自定义哈希函数。例如,以下是一个为 std::pair<int, int> 定义自定义哈希函数的示例:

#include <iostream>
#include <unordered_set>using PII = std::pair<int, int>;int main() {auto hash_function = [](const PII& o) {return std::hash<int>()(o.first) ^ std::hash<int>()(o.second);};std::unordered_set<PII, decltype(hash_function)> mySet(0, hash_function);mySet.emplace(3, 5);mySet.emplace(2, 4);for (const auto& p : mySet) {std::cout << "(" << p.first << ", " << p.second << ")" << std::endl;}return 0;
}

在这个例子中,我们使用Lambda表达式定义了一个哈希函数,并将其传递给 unordered_set,从而能够存储和管理 std::pair<int, int> 类型的元素。

结论

Lambda表达式是C++中一个强大且灵活的特性。它们使得代码更简洁、更易读,并且在处理函数对象时非常方便。无论是在标准库算法中,还是在自定义函数对象中,Lambda表达式都能发挥重要作用。通过理解和掌握Lambda表达式,开发者可以更高效地编写现代C++代码,充分利用C++11及其后的标准所提供的新特性。

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

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

相关文章

ASP.NET Core 使用Log4net

1. Nuget安装log4net&#xff0c;图里的两个 2.项目根目录下添加log4net.config.添加下面的代码: <?xml version"1.0" encoding"utf-8"?> <configuration><!-- This section contains the log4net configuration settings --><log…

C语言之常用内存函数以及模拟实现

目录 前言 一、memcpy的使用和模拟实现 二、memmove的使用和模拟实现 三、memset的使用和模拟实现 四、memcmp的使用和模拟实现 总结 前言 本文主要讲述C语言中常用的内存函数&#xff1a;memcpy、memmove、memset、memcmp。内容不多&#xff0c;除了了解如何使用&#x…

细说MCU的ADC模块单通道连续采样的实现方法

目录 一、工程依赖的硬件及背景 二、设计目的 三、建立工程 1、配置GPIO 2、选择时钟源和Debug 3、配置ADC 4、配置系统时钟和ADC时钟 5、配置TIM3 6、配置串口 四、代码修改 1、重定义TIM3中断回调函数 2、启动ADC及重写其回调函数 3、定义用于存储转换结果的数…

WHAT - SWR(stale-while-revalidate)HTTP 缓存失效策略 - 请求方案

目录 介绍传统数据请求的 React 代码示例SWR 的 React 代码示例SWR 的优势和不同之处 可复用组件真实示例特性解读自动重新请求1. 聚焦时重新请求2. 定期重新请求3. 重新连接时重新请求 条件数据请求1. 按需请求2. 依赖请求 数据更改1. 乐观更新2. 在数据更改后更新缓存3. 基于…

一个pdf分割成多个pdf,一个pdf分成多个pdf

在数字化办公和学习中&#xff0c;pdf格式因其良好的兼容性和稳定性而受到广泛欢迎。但有时候&#xff0c;我们可能需要将一个大的pdf文件分割成多个小文件&#xff0c;以便于分享、打印或编辑。今天&#xff0c;我就来教大家几种简单有效的方法&#xff0c;让你轻松实现pdf文件…

基于Wireshark和TiWsPC(Wireshark Packet Converter)的Zigbee抓包

前言 介绍几种Zigbee抓包方式&#xff1a; 1. Ubiqua 使用教程网上非常多也非常清晰&#xff1b; 但是Ubiqua是收费软件&#xff0c;较贵&#xff1b; 我安装过了&#xff0c;费好多事&#xff0c;没安装成功。 2. Killerbee套件 https://github.com/riverloopsec/killerbe…

WACV2023论文速览域迁移Domain相关

Paper1 CellTranspose: Few-Shot Domain Adaptation for Cellular Instance Segmentation 摘要原文: Automated cellular instance segmentation is a process utilized for accelerating biological research for the past two decades, and recent advancements have produc…

Ad-hoc命令和模块简介

华子目录 Ad-hoc命令和模块简介1.概念2.格式3.Ansible命令常用参数4.模块类型4.1 三种模块类型4.2Ansible核心模块和附加模块 示例1示例2 Ad-hoc命令和模块简介 1.概念 Ansible提供两种方式去完成任务&#xff0c;一是ad-hoc命令&#xff0c;一是写Ansible playbook(剧本)Ad-…

【电商纯干货分享】干货速看!电商数据集数据API接口数据分析大全!

数据分析——深入探索中小企业数字化转型&#xff0c;专注提供各行业数据分析干货、分析技巧、工具推荐以及各类超实用分析模板&#xff0c;为钻研于数据分析的朋友们加油充电。 公共参数 名称类型必须描述keyString是调用key&#xff08;必须以GET方式拼接在URL中&#xff09…

02浅谈大模型文本生成的背后逻辑

02浅谈大语言模型文本生成的背后逻辑 两个概念&#xff1a; 通俗理解大模型文本生成逻辑 假设有一个prompt&#xff1a;How are you &#xff1f;&#xff0c;输入给大模型&#xff0c;那么大模型使怎么输出&#xff1f;

uni-app x 跨平台开发框架

目录 uni-app x 是什么 和Flutter对比 uts语言 uvue渲染引擎 组合式API的写法 选项式API写法 页面生命周期 API pages.json全局配置文件 总结 uni-app x 是什么 uni-app x&#xff0c;是下一代 uni-app&#xff0c;是一个跨平台应用开发引擎。 uni-app x 是一个庞…

使用 HAProxy 进行 MySQL 负载均衡

本章教程主要记录如何用HAProxy 实现MySQL负载均衡配置。 一、安装haproxy 在 Ubuntu/Debian 上&#xff1a; sudo apt-get update sudo apt-get install haproxy在 CentOS/RHEL 上&#xff1a; sudo yum install haproxy二、配置haproxy 编辑 HAProxy 配置文件&#xff08;…

ETAS工具导入Com Arxml修改步骤

文章目录 前言Confgen之前的更改Confgen之后的修改CANCanIfComComMEcuM修改CanNmCanSMDCMCanTp生成RTE过程报错修改DEXT-诊断文件修改Extract问题总结前言 通讯协议栈开发一般通过导入DBC实现,ETAS工具本身导入DBC也是生成arxml后执行cfggen,本文介绍直接导入客户提供的arxml…

IP-Guard定制函数配置说明

设置客户端配置屏蔽&#xff1a; 关键字&#xff1a;disfunc_austascrtrd 内容&#xff1a;1 策略效果&#xff1a;屏幕整个屏幕监控模块。会导致屏幕历史查询这个功能也不能使用。 security_proxy1 安全代理参数 safe_enforce_authproc进程 强制软件上 安全代理网关&#xf…

Spring中@Transactional的实现和原理

这篇文章写的很详细了&#xff0c;引自脚本之家 Java中SpringBoot的Transactional原理_java_脚本之家

深入理解Qt的隐式共享机制

在Qt中&#xff0c;一个关键的性能优化特性是其数据结构的隐式共享机制&#xff0c;这在Qt的文档和API中常被称为“隐式共享”或“写时复制&#xff08;Copy-On-Write, COW&#xff09;”。本文将详细介绍这一机制&#xff0c;并通过QString类的实现代码和相应的反汇编代码来阐…

动态颤抖的眼睛效果404页面源码

动态颤抖的眼睛效果404页面源码&#xff0c; 源码由HTMLCSSJS组成&#xff0c;记事本打开源码文件可以进行内容文字之类的修改&#xff0c;双击html文件可以本地运行效果&#xff0c;也可以上传到服务器里面&#xff0c;重定向这个界面 动态颤抖的眼睛效果404页面源码

springboot+vue+mybatis图书馆借阅管理系统+PPT+论文+讲解+售后

21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存储达到…

python 将stl数据转为vtk

在Python中&#xff0c;可以使用vtk库将STL&#xff08;Stereolithography&#xff09;三维模型数据转换为VTK&#xff08;Visualization Toolkit&#xff09;格式。以下是一个简单的例子&#xff0c;演示如何进行转换&#xff1a; 首先&#xff0c;确保安装了vtk库。如果没有…

AI大模型时代的存储发展趋势

从2022年下半年&#xff0c;大模型和AIGC这两个词变得极其火热&#xff0c;而GPU的市场也是一卡难求。对于这种迷乱和火热&#xff0c;让我想起了当年的比特币挖矿和IPFS。似乎世界一年一个新风口&#xff0c;比特币、元宇宙、NFT、AIGC&#xff0c;金钱永不眠&#xff0c;IT炒…