Android常用C++特性之lambda表达式

声明:本文内容生成自ChatGPT,为方便大家了解学习作为引用到其他文章中。

C++ 中的 lambda 表达式 是一种简洁的语法,用于定义 匿名函数,即无需为函数命名的函数。它允许你在函数体内定义和使用临时的可调用对象,非常适合用于回调、简化算法操作和避免定义冗长的小函数。

Lambda 表达式的语法

[capture](parameters) -> return_type {// function body
}
各部分的解释:
  • capture:捕获列表,用于捕获作用域中的变量。
  • parameters:参数列表,类似于普通函数的参数。
  • return_type:返回类型(可选)。可以自动推导,也可以显式指定。
  • function body:函数体,表示 lambda 表达式的具体执行逻辑。

示例

1. 最简单的 lambda
#include <iostream>int main() {auto greet = []() { std::cout << "Hello, World!" << std::endl; };greet(); // 调用 lambdareturn 0;
}
2. 带参数的 lambda
#include <iostream>int main() {auto add = [](int a, int b) { return a + b; };std::cout << "Sum: " << add(3, 4) << std::endl; // 输出: Sum: 7return 0;
}
3. 带捕获列表的 lambda

捕获列表用于捕获外部作用域中的变量。你可以通过值或引用来捕获变量。

  • 按值捕获:捕获的变量的副本。
  • 按引用捕获:捕获变量的引用,允许修改。
#include <iostream>int main() {int x = 10;int y = 20;// 按值捕获 x,按引用捕获 yauto lambda = [x, &y]() {std::cout << "x: " << x << ", y: " << y << std::endl;// y 可以修改,x 是捕获的副本,不能修改y += 10;};lambda(); // 输出: x: 10, y: 20std::cout << "y after lambda: " << y << std::endl; // 输出: y after lambda: 30return 0;
}
4. 捕获所有变量
  • 使用 [=] 捕获外部作用域中的所有变量 按值 传递。
  • 使用 [&] 捕获外部作用域中的所有变量 按引用 传递。
#include <iostream>int main() {int a = 5, b = 10;// 按值捕获所有变量auto lambda_by_value = [=]() {std::cout << "a: " << a << ", b: " << b << std::endl;};// 按引用捕获所有变量auto lambda_by_ref = [&]() {a += 10;b += 20;};lambda_by_value(); // 输出: a: 5, b: 10lambda_by_ref();   // 修改外部变量std::cout << "a: " << a << ", b: " << b << std::endl; // 输出: a: 15, b: 30return 0;
}
5. 指定返回类型

如果 lambda 表达式的返回类型不能自动推导,或者返回类型是复杂的类型,可以显式指定返回类型。

#include <iostream>int main() {auto divide = [](int a, int b) -> double {return static_cast<double>(a) / b;};std::cout << "Result: " << divide(10, 3) << std::endl; // 输出: Result: 3.33333return 0;
}

常见用途

1. 与标准库算法配合使用

Lambda 表达式常用于标准库的算法中,如 std::for_each, std::sort, std::transform 等。

#include <iostream>
#include <vector>
#include <algorithm>int main() {std::vector<int> vec = {5, 2, 9, 1, 5, 6};// 使用 lambda 表达式进行排序std::sort(vec.begin(), vec.end(), [](int a, int b) {return a < b;});// 使用 lambda 表达式遍历并输出std::for_each(vec.begin(), vec.end(), [](int n) {std::cout << n << " ";});std::cout << std::endl;return 0;
}
2. 捕获外部变量并用于回调函数

Lambda 表达式适合在事件驱动或回调场景中使用。

#include <iostream>
#include <functional>void performTask(std::function<void()> task) {task();
}int main() {int counter = 0;performTask([&counter]() {counter += 1;std::cout << "Counter: " << counter << std::endl;});return 0;
}

总结

  • 捕获方式:通过捕获列表 [ ] 指定捕获外部变量的方式。
  • 简洁性:可以用 lambda 表达式代替简单的函数或函数对象,简化代码。
  • 应用场景:适合临时、匿名的可调用对象,特别是在回调、算法、事件处理中广泛应用。

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

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

相关文章

css实现自定义静态进度条-vue2

实现如图所示 html&#xff1a; <div class"progress-container"><div class"progress-box left" :style"leftStyle"><div class"progress-value-top left">总中标电量</div><div class"progress-val…

前端请求音频返回pcm流进行播放

业务场景是chat回答&#xff0c;点击播放则会将回答内容进行请求&#xff0c;返回音频数据流进行播放 实现方案&#xff0c;因为后端返回的是流式接口&#xff0c;但是流式接口我去截取后用自己完成的流式播放器方法进行播放会存在杂音&#xff0c;但是短句接口返回速度尚可&a…

composer环境变量(phpstudy集成环境)无法使用问题

composer 不是内部或外部命令,也不是可运行的程序 或批处理文件。 按下WinR组合键打开“运行”&#xff0c;输入sysdm.cpl 回车&#xff0c;打开“系统属性”并切换至“高级”选项卡&#xff0c;点击“环境变量”进行配置 配置完后点击确定&#xff0c;重新打开命令行&#x…

Bootstrap框架-container类,container-fluid类,栅格系统

1.Bootstrap Bootstrap为页面内容和栅格系统包裹了一个.container容器&#xff0c;框架预先定义类 1.1container类 响应式布局容器的宽度 手机-小于768px 宽度设置100%&#xff1b; 平板-大于等于768px 设置宽度为750px 桌面显示器-大于等于992px 设置宽度 970px 大屏幕显…

康养为松,智能为鹤:华为全屋智能画出的松鹤长春图

在道家文化中&#xff0c;喜欢将松与鹤并举&#xff0c;以其长寿与仙逸表达对老年人的美好祝愿。松鹤延年、松龄鹤寿等成语皆出于此。松鹤长春图&#xff0c;也成为国画当中的经久不衰的题材。 当我们迎来老龄化时代&#xff0c;“松鹤长春”则成为了整个社会的共同期待。 根据…

【初阶数据结构】排序——插入排序

目录 前言直接插入排序希尔排序 前言 排序&#xff1a;所谓排序就是使一串记录&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。排序算法&#xff0c;就是如何使得记录按照要求排列的方法。   例如&#xff1a;买东西时会根据销量或价…

java并发编程笔记 之 线程和进程

文章目录 前言线程线程优先级和时间片创建多线程及运行线程的状态 进程查看进程的命令进程的通信方式 线程和进程的区别从关系上疑问集锦 前言 并发 1、并发是指在同一时间段内&#xff0c;计算机系统能够处理多个任务的能力。 2、在并发编程中&#xff0c;我们可以理解为多个…

代码随想录算法训练营第三十九天 | 198.打家劫舍 ,213.打家劫舍II,337.打家劫舍III

第三十九天打卡&#xff0c;今天解决打家劫舍系列问题&#xff0c;树形dp比较难。 198.打家劫舍 题目链接 解题过程 dp[i]&#xff1a;考虑下标i&#xff08;包括i&#xff09;以内的房屋&#xff0c;最多可以偷窃的金额为dp[i]。 要么不偷这一间&#xff0c;那就是前面那间…

毕业设计选题:基于ssm+vue+uniapp的校园失物招领小程序

开发语言&#xff1a;Java框架&#xff1a;ssmuniappJDK版本&#xff1a;JDK1.8服务器&#xff1a;tomcat7数据库&#xff1a;mysql 5.7&#xff08;一定要5.7版本&#xff09;数据库工具&#xff1a;Navicat11开发软件&#xff1a;eclipse/myeclipse/ideaMaven包&#xff1a;M…

大瓜-CSP-J/S2024第一轮认证题目涉嫌泄露。竞赛公平能否维护?

2024年全国信息学奥赛&#xff08;CSP-J/S&#xff09;泄题事件在竞赛界掀起了巨大的波澜。这场赛事本应是全国最具公信力的编程竞赛之一&#xff0c;但部分题目在考试前已被某些培训机构押中&#xff0c;这一泄题行为不仅让考生与家长感到愤怒&#xff0c;也让公众对奥赛的公平…

scp 命令:在两台主机间远程传输文件

一、命令简介 ​scp​ 命令使用 SSH ​加密的方式在本地主机和远程主机之间复制文件。 ‍ 二、命令参数 格式 scp [选项] 发送方主机和目录 接收方主机和目录注意&#xff1a;左边是发送方&#xff0c;右边是接收方。固定格式。 示例 #示例1 scp ~/test.txt soulio172.1…

豆包MarsCode体验

这个AI助手贴合做题者的思路&#xff0c;可以实时对代码进行分析&#xff0c;提出纠错、优化、规范性意见&#xff0c;非常好用。

基于数据挖掘的航空客户满意度分析预测系统

温馨提示&#xff1a;文末有 CSDN 平台官方提供的学长 QQ 名片 :) 1. 项目简介 航空公司致力于提供多样化的服务以满足乘客需求&#xff0c;包括但不限于提供免费无线网络、免费食物饮品、提供网上预约服务、飞机出口位置、座椅舒适度、卫生状况等&#xff0c;并希望以此提升乘…

构造者模式多种实现方式

构造者模式 ​ 构造者模式建议将对象构造代码从产品类中抽取出来&#xff0c; 并将其放在一个名为构造者的独立对象中 ​ 构建者模式也是用来创建对象&#xff0c;但是相对于工厂模式来说&#xff0c;建造者模式适用于构建复杂对象&#xff0c;而工厂模式适用于创建对象的封装…

asp.net core日志与异常处理小结

asp.net core的webApplicationBuilder中自带了一个日志组件,无需手动注册服务就能直接在控制器中构造注入&#xff0c;本文主要介绍了net core日志与异常处理小结&#xff0c;需要的朋友可以参考下 ILogger简单使用 asp.net core的webApplicationBuilder中自带了一个日志组件…

网络安全-长亭雷池waf的sql绕过,安全狗绕过(5种绕过3+2)

目录 一、环境 二、讲解 三、绕过前思路整理 3.1 思路 3.1.1 入门思路 0x00截断filename 3.1.2 双写上传描述行(差异绕过&#xff09;【成功】 3.1.3双写整个 part 开头部分 3.1.4 构造假的 part 部分 1【成功】 3.1.5 构造假的 part 部分2【成功】 3.1.6 两个 bounda…

闲盒支持的组网方式和注意事项

1. 直连光猫拨号​ 通过光猫拨号&#xff0c;设备直连光猫的设备&#xff0c;需要对光猫开启UPNP并关闭DMZ 如果只接一个盒子&#xff0c;建议直接针对盒子IP开dmz。 2. 直连路由器​ 通过路由器拨号&#xff0c;设备直连路由器的设备&#xff0c;需要对路由器开启UPNP并关闭…

Sql Developer日期显示格式设置

默认时间格式显示 设置时间格式&#xff1a;工具->首选项->数据库->NLS->日期格式: DD-MON-RR 修改为: YYYY-MM-DD HH24:MI:SS 设置完格式显示&#xff1a;

【Java数据结构】 ---对象的比较

乐观学习&#xff0c;乐观生活&#xff0c;才能不断前进啊&#xff01;&#xff01;&#xff01; 我的主页&#xff1a;optimistic_chen 我的专栏&#xff1a;c语言 &#xff0c;Java 欢迎大家访问~ 创作不易&#xff0c;大佬们点赞鼓励下吧~ 前言 上图中&#xff0c;线性表、堆…

【嵌入式linux开发】SPI设备文件操作BMI088传感器

【嵌入式linux开发】SPI设备文件操作BMI088传感器 前言一、数据手册浅读二、代码 前言 在本篇博客中&#xff0c;将从BMI088传感器的数据手册出发&#xff0c;简单了解之后&#xff0c;展示如何通过SPI设备文件与传感器进行通信。除了使用linux文件设备操作spi接口&#xff0c…