探索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; // 输出结果:30
    std::cout << "y: " << y << std::endl; // 输出结果:30

    return 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.mfbz.cn/a/778183.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

跟《经济学人》学英文:2024年06月01日这期 The side-effects of the TikTok tussle

The side-effects of the TikTok tussle tussle&#xff1a;美 [ˈtəsəl] 激烈扭打&#xff1b;争夺 注意发音 side-effects&#xff1a;副作用&#xff1b;&#xff08;side-effect的复数&#xff09; As the app’s future hangs in the balance, the ramifications of …

2024年中国十大杰出起名大师排行榜,最厉害的易经姓名学改名字专家

在2024年揭晓的中国十大杰出易学泰斗评选中&#xff0c;一系列对姓名学与国学易经有深入研究的专家荣登榜单。其中&#xff0c;中国十大权威姓名学专家泰斗顶级杰出代表人物的师傅颜廷利大师以其在国际舞台上的卓越贡献和深邃学识&#xff0c;被公认为姓名学及易经起名领域的权…

关于linux服务器更改镜像后连接不上vscode问题

问题样子解决办法直接看 问题样子 问题描述&#xff1a;从centos换到ubantu后&#xff0c;xshell能直接连接上&#xff08;没有更改ssh配置信息&#xff09;&#xff0c;但是vscode连不上&#xff08;配置文件因为端口号和ip是一样的&#xff0c;也没法改&#xff09; 猜测…

SwinUnet详解

文章目录 摘要一. 编码端模块1. PatchEmbed2. SwinTransformerBlock2.1. Window_partition2.2. WindowAttention2.3. Window_reverse2.4. MLP 3. PatchMerging 二. 解码端模块三. 完整流程图 摘要 swinunet基本结构&#xff1a; swinunet采用编码器-解码器结构&#xff1a; 编…

vulnhub靶场之Jarbas

1 信息收集 1.1 主机发现 arp-scan -l 发现主机IP地址为&#xff1a;192.168.1.16 1.2 端口发现 nmap -sS -sV -A -T5 -p- 192.168.1.16 存在端口22&#xff0c;80&#xff0c;3306&#xff0c;8080 1.3 目录扫描 dirsearch -u 192.168.1.16 2 端口访问 2.1 80端口 2.2…

[单master节点k8s部署]20.监控系统构建(五)Alertmanager

prometheus将监控到的异常事件发送给Alertmanager&#xff0c;然后Alertmanager将报警信息发送到邮箱等设备。可以从下图看出&#xff0c;push alerts是由Prometheus发起的。 安装Alertmanager config文件 [rootmaster prometheus]# cat alertmanager-cm.yaml kind: ConfigMa…

FreeRTOS——队列集

一、队列集 一个队列只允许任务间传递的消息为 同一种数据类型 &#xff0c;如果需要在任务间 传递不同数据类型的消息 时&#xff0c;那么就可以使用队列集 作用&#xff1a;用于对多个队列或信号量进行“监听”&#xff08;接收或获取&#xff09;&#xff0c;其中 不管哪一…

返回值处理器器【Spring源码学习】

定义返回值类型处理器的组合&#xff1b; public static HandlerMethodReturnValueHandlerComposite getReturnValueHandler(){HandlerMethodReturnValueHandlerComposite composite new HandlerMethodReturnValueHandlerComposite();// 处理ModelAndViewcomposite.addHandle…

Opencv的基本操作(一)图像的读取显示存储及几何图形的绘制

文件的读取、显示、存取 cv2.imread(imagepath,IMREAD.xxx) 读取图像cv2.imshow(窗口名称,mat图片) 显示图像cv2.imwrite(保存的位置,img) 保存图像 # 1. 读取图像 原始图片路径&#xff0c;图片读取模式 cv2.imread(imagepath,IMREAD.xxx)cv2.IMREAD_COLOR 彩色模式读取 cv2…

三、数据库系统(考点篇)试题

聚簇索引&#xff0c;也叫簇类索引&#xff0c;原理是对磁盘上实际数据重新组织以按指定的一个或多个列的值排序于聚簇索引的索引页面指针指向数据页面&#xff0c;所以使用聚簇索引查找数据几乎总是比使用非聚簇索引快。每张表只能建一个聚簇索引&#xff0c;并且建聚簇索引需…

Mysql慢日志、慢SQL

慢查询日志 查看执行慢的SQL语句&#xff0c;需要先开启慢查询日志。 MySQL 的慢查询日志&#xff0c;记录在 MySQL 中响应时间超过阀值的语句&#xff08;具体指运行时间超过 long_query_time 值的SQL。long_query_time 的默认值为10&#xff0c;意思是运行10秒以上(不含10秒…

MYSQL 四、mysql进阶 6(索引的创建与设计原则)

一、索引的声明和使用 1.1 索引的分类 MySQL的索引包括普通索引、唯一性索引、全文索引、单列索引、多列索引和空间索引等。 从 功能逻辑 上说&#xff0c;索引主要有 4 种&#xff0c;分别是普通索引、唯一索引、主键索引、全文索引。 按照 物理实现方式 &#xff0c;索引可…

硕士文凭再耀眼,也没有第一学历刺眼?

在当今社会,教育被视为个人发展和社会进步的重要基石。随着高等教育的普及和竞争的加剧,学历成为了衡量个人能力、决定职业前景的重要标尺。然而,在这一过程中,“第一学历”的概念逐渐凸显,其影响力甚至在某些情况下超越了后续的硕士、博士等更高学历。这一现象引发了广泛…

如何使用HippoRAG增强LLM的记忆

大型语言模型&#xff08;LLM&#xff09;已经证明是一种非常宝贵的思考工具。经过大量文本、代码和其他媒体数据集的训练&#xff0c;它们能够创作出接近人类水平的文章、翻译语言、生成图像&#xff0c;还能以信息丰富的方式回答人们提出的问题&#xff0c;甚至可以编写不同类…

react_后台管理_项目

目录 1.运行项目 2. 项目结构 ①项目顶部导航栏 ②项目左侧导航栏 ③主页面-路由切换区 本项目使用的是 reacttsscss 技术栈。 1.运行项目 在当前页面顶部下载本项目&#xff0c;解压后使用编辑器打开&#xff0c;然后再终端输入命令&#xff1a; npm i 下载依赖后&am…

Vue 数据大屏适配

1、准备俩个盒子 .dataScreen-content 盒子内容根据设计稿给的px单位进行正常的布局就行 2、盒子的CSS样式 .dataScreen-container {width: 100%;height: 100%;// 有背景图需要的样式background: url("./images/bg.png") no-repeat;background-repeat: no-repeat;b…

AI对于高考和IT行业的深远影响

目录 AI对IT行业的冲击及深远影响1. 工作自动化2. 新的就业机会3. 行业融合4. 技术升级和创新5. 数据的重要性 IT行业的冬天要持续多久&#xff1f;大学的软件开发类专业是否还值得报考&#xff1f;其他问题IT行业是否都是加班严重&#xff1f;35岁后就业困难是否普遍现象&…

在 PostgreSQL 中,如何处理多个长时间运行的查询对系统资源的竞争?

文章目录 一、问题分析二、解决方案&#xff08;一&#xff09;优化查询语句&#xff08;二&#xff09;限制资源使用&#xff08;三&#xff09;调整数据库参数&#xff08;四&#xff09;监控和分析查询性能&#xff08;五&#xff09;分区表&#xff08;六&#xff09;异步处…

策略为王股票软件源代码-----如何修改为自己软件73------------主界面右下角,大盘指数,时间显示 ,

IDS_MAINFRAME_SHINDEXTIP "沪:%2.f %+.2f %.2f亿" IDS_MAINFRAME_SZINDEXTIP "深:%2.f %+.2f %.2f亿" 主界面右下角,大盘指数,时间显示 , if( TIMER_TIME == nIDEvent ) { CSPTime time = CSPTime::GetCurrentTime(); …

ruoyi mybatis pagehelper 分页优化(自定义limit位置)clickhouse 外部数据源

例如加入clickhouse的分页时发现extends 不生效 则可以添加 startPage();registerDialectAlias("clickhouse", PageMySqlDialectPlus.class);List<MyMonitorlog> list monitorlogService.selectMonitorlogList(monitorlog);主要是需要注册 registerDialectAl…