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

embedded/2024/11/12 13:45:44/

声明:本文内容生成自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.ppmy.cn/embedded/116178.html

相关文章

统信服务器操作系统【Cron定时任务服务】

Cron定时任务服务服务介绍、服务管理、服务配置 文章目录 一、功能概述二、功能介绍1. Cron 服务管理2.Cron 服务管理3.Cron 服务配置run-parts一、功能概述 cron是一个可以用来根据时间、日期、月份、星期的组合来 调度对周期性任务执行的守护进程。利用 cron 所提供的功能,可…

基于SpringBoot+Vue+MySQL的养老院管理系统

系统展示 管理员界面 家属界面 系统背景 随着全球人口老龄化的加速&#xff0c;养老院管理面临着前所未有的挑战。传统管理方式存在信息不透明、效率低下、资源分配不均等问题&#xff0c;难以满足日益增长的养老服务需求。因此&#xff0c;开发一套智能化、高效的养老院管理系…

【Java8 重要特性】Lambda 表达式

文章目录 Lambda函数式接口Lambda 规则规范简化过程改写 Arrays.setAll()改写 Arrays.sort() forEach循环 list 集合循环 list 集合并输出对象信息循环 Map 集合 方法引用和构造器引用方法引用构造器引用 Lambda Lambda是一个匿名函数&#xff0c;我们可以将Lambda表达式理解为…

Vue学习记录之六(组件实战及BEM框架了解)

一、BEM BEM是一种前端开发中常用的命名约定&#xff0c;主要用于CSS和HTML的结构化和模块化。BEM是Block、Element、Modifier的缩写。 Block&#xff08;块&#xff09;&#xff1a;独立的功能性页面组件&#xff0c;可以是一个简单的按钮&#xff0c;一个复杂的导航条&…

# 高可用的并发解决方案nginx+keepalived(三)

高可用的并发解决方案nginxkeepalived&#xff08;三&#xff09; 一、Nginx搭建图片服务器 针对任何站点&#xff0c;几乎都要访问图片&#xff0c;而一个网页里面几乎有好些张图片&#xff0c;这时候会占据大量tomcat连接&#xff0c;造成大量并发&#xff0c;我们可以通过…

股票程序化接口,什么性能的笔记本,用作数据分析,量化交易

炒股自动化&#xff1a;申请官方API接口&#xff0c;散户也可以 python炒股自动化&#xff08;0&#xff09;&#xff0c;申请券商API接口 python炒股自动化&#xff08;1&#xff09;&#xff0c;量化交易接口区别 Python炒股自动化&#xff08;2&#xff09;&#xff1a;获取…

获取商品销量详情API:深入解析返回值

在电商领域&#xff0c;了解商品的销量详情对于商家制定营销策略、优化库存管理和提升用户体验至关重要。通过调用获取商品销量详情的API接口&#xff0c;商家可以实时获取关键的销售数据&#xff0c;从而做出更加明智的决策。本文将深入解析获取商品销量详情API的返回值&#…

简历技能面试问答

变成语言和开发工具 C新特性 自动类型推导 (auto)&#xff1a; 自动推导变量的类型&#xff0c;减少显式类型声明的繁琐 范围 for 循环&#xff1a; 用于遍历容器或数组&#xff0c;简化代码。 nullptr&#xff1a; nullptr 取代 NULL&#xff0c;表示空指针&#xff0c;类…