c++中使用lambda表达式的作用和用法

lambda表达式

这是C++11引入的一种新特性,它可以让您在需要定义函数对象的地方,直接编写一个匿名的、可以捕获上下文变量的函数体,非常适合用作回调函数、临时计算或定义小型函数对象。

lambda表达式与普通函数类似,也有参数列表、返回值类型和函数体,只是它的定义方式更简洁,并且可以在函数内部定义。

lambda表达式的语法

lambda表达式的一般形式如下:

[capture] (parameters) mutable -> return-type { body }

其中:

  • [capture]捕获列表,表示lambda表达式可以捕获哪些上下文中的变量,以值或引用的方式。捕获列表可以为空,表示不捕获任何变量,也可以使用 = & 表示按值或引用捕获所有变量,还可以指定具体的变量名,用逗号分隔。例如:
[a, &b] // 按值捕获a,按引用捕获b
[=, &c] // 按值捕获所有变量,但按引用捕获c
[&] // 按引用捕获所有变量
[this] // 捕获当前的this指针
  • (parameters)参数列表,表示lambda表达式可以接受哪些参数,与普通函数的参数列表相同。参数列表可以为空,表示不接受任何参数,也可以使用auto来推断参数类型。例如:
() // 不接受任何参数
(int x, double y) // 接受两个参数,类型分别为int和double
(auto x, auto y) // 接受两个参数,类型由编译器推断
  • mutable修饰符,表示lambda表达式的函数体可以修改按值捕获的变量,否则默认是常量。如果使用了mutable,则参数列表不能省略。例如:

    [x] () mutable { x++; } // 可以修改按值捕获的x
    [x] () { x++; } // 错误,不能修改常量x
    
  • -> return-type返回值类型,表示lambda表达式的返回值的类型,与普通函数的返回值类型相同。返回值类型可以省略,由编译器根据函数体的返回语句推断。例如:

    () -> int { return 42; } // 返回值类型为int
    () { return 42; } // 返回值类型由编译器推断为int
    
  • { body }函数体,表示lambda表达式的具体逻辑,与普通函数的函数体相同。函数体可以使用捕获列表和参数列表中的变量,也可以调用其他函数或lambda表达式。例如:

    [a] (int x) { return a + x; } // 函数体返回a和x的和
    [] { std::cout << "Hello" << std::endl; } // 函数体打印一句话
    

lambda表达式的使用

lambda表达式的使用方法是在定义的地方加上一对圆括号,表示调用该lambda表达式,括号中可以传递参数,也可以为空。lambda表达式的返回值可以赋值给一个变量,也可以作为另一个函数的参数或返回值。lambda表达式的使用场景有很多,

举例:

当不使用 lambda表达式时代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>// Define a function to print an integer
void print_int(int x) {std::cout << x <<",";
}// Define a function object to compare two integers by their absolute values
struct abs_compare {bool operator()(int x, int y) {return std::abs(x) > std::abs(y);}
};int main() {std::vector<int> v1 = {1, -12, 3, -4, 5,6,7,-9};// Use the print_int function as the third argument of std::for_eachstd::for_each(v1.begin(), v1.end(), print_int);std::cout << std::endl;// Use the abs_compare function object as the third argument of std::sortstd::sort(v1.begin(), v1.end(), abs_compare());// Use the print_int function againstd::for_each(v1.begin(), v1.end(), print_int);return 0;
}

 

当使用 lambda表达式时的代码:

#include <iostream>
#include <vector>
#include <algorithm>
int main()
{std::vector<int> v1 = {1, -12, 3, -4, 5,6,7,-9};// Use brackets around the lambda expressionstd::for_each(v1.begin(),v1.end(),  [] (const int& x){std::cout<<x<<",";});std::cout<<std::endl;// Use braces around the lambda bodystd::sort(v1.begin(),v1.end(),    [] (const int& x,const int& y){return abs(x) > abs(y);});std::for_each(v1.begin(),v1.end(),[](const int &x){std::cout<<x<<",";});return 0;
}

例如:

  • 作为回调函数,例如在STL的算法中,可以使用lambda表达式来自定义比较函数、谓词函数、操作函数等。例如:

    std::vector<int> v{1, 2, 3, 4, 5};
    // 使用lambda表达式作为比较函数,按照绝对值降序排序
    std::sort(v.begin(), v.end(), [] (const int &x,const int &y) { return abs(x) > abs(y); });
    // 使用lambda表达式作为谓词函数,查找第一个偶数
    auto it = std::find_if(v.begin(), v.end(),[] (const int &x) { return x % 2 == 0; });
    // 使用lambda表达式作为操作函数,对每个元素加一
    std::for_each(v.begin(), v.end(), [] (const int &x)  { x++; });
    
  • 作为临时计算,例如在需要一个简单的计算结果时,可以使用lambda表达式来封装计算逻辑,而不需要定义一个单独的函数。

例如:使用lambda表达式计算两个数的最大公约数

// 定义一个lambda表达式,接受两个参数a和b,返回它们的最大公约数
auto gcd = [] (int a, int b) -> int {if (b == 0) return a;else return gcd(b, a % b);
};// 调用lambda表达式,传入24和36
int result = gcd(24, 36);// 输出结果
std::cout << "最大公约数是:" << result << std::endl;
  • 作为小型函数对象,例如在需要一个简单的函数对象时,可以使用lambda表达式来定义一个匿名的函数对象,而不需要定义一个单独的类或结构体。

例如:使用lambda表达式定义一个函数对象,用于计算两个数的和

auto adder = [](const int &x,const int &y) { return x + y; };
std::cout << adder(1, 2) << std::endl; // 输出3

参考链接:

C++ Lambda表达式的完整介绍 - 知乎 (zhihu.com)

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

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

相关文章

存内计算技术大幅提升机器学习算法的性能—挑战与解决方案探讨

一.存内计算技术大幅机器学习算法的性能 1.1背景 人工智能技术的迅速发展使人工智能芯片成为备受关注的关键组成部分。在人工智能的构建中&#xff0c;算力是三个支柱之一&#xff0c;包括数据、算法和算力。目前&#xff0c;人工智能芯片的发展主要集中在两个方向&#xff1…

云计算新宠:探索Apache Doris的云原生策略

文章目录 Apache Doris 特性极简架构高效自运维高并发场景支持MPP 执行引擎明细与聚合模型的统一便捷数据接入 Apache Doris 极速 1.0 时代极速列式内存布局向量化的计算框架Cache 亲和度虚函数调用SIMD 指令集 稳定多源 关于 Apache Doris 开源社区基于云原生向量数据库Milvus…

腾讯云服务器宝塔面板中Docker应用无法访问

今天在用宝塔面板的时候用Docker一键部署Jenkins 发现部署好了端口也都开放了&#xff0c;防火墙也都开放了&#xff0c;安全组也都开放了。但是就是访问不了。 解决办法&#xff0c;在服务器终端执行下面指令 echo net.ipv4.ip_forward 1 >> /etc/sysctl.conf &…

vmware 中虚拟机Ubuntu磁盘不够,扩展磁盘,并分配

vmware 中虚拟机Ubuntu磁盘不够&#xff0c;扩展磁盘&#xff0c;并分配 Ubuntu虚拟机处于关机状态。虚拟机 -> 设置 ->硬盘 ->扩展 &#xff0c;可以直接多给点&#xff0c;这里只是做演示。 3.开启虚拟机&#xff0c;一般不会报错&#xff0c;我这里报错了&#…

Base 链官方点名 $AYB,继续飙涨指日可待?

近期 $AYB&#xff08;All Your Base Are Belong To Us&#xff09; 成为了 BASE 链上最火的 meme 项目&#xff0c;据悉 $AYB 在去年年底上线至今涨幅已经超过了 100 倍&#xff0c;其在被各大加密社区、KOL 追捧的同时&#xff0c;也被公认是继 Solana 上的 $BONK、Avalanche…

【Leetcode每日一题】二分查找 - 寻找旋转排序数组中的最小值(难度⭐⭐)(22)

1. 题目解析 Leetcode链接&#xff1a;153. 寻找旋转排序数组中的最小值 这个题目乍一看很长很复杂&#xff0c;又是旋转数组又是最小值的 但是仔细想想&#xff0c;结合题目给的示例&#xff0c;不难看出可以用二分的方法来解决 核心在于找到给定数组里面的最小值 2. 算法原…

亚信安慧AntDB开启超融合数据库新纪元

&#xff08;一&#xff09; 前言 据统计&#xff0c;在信息化时代的今天&#xff0c;人们一天所接触到的信息量&#xff0c;是古人一辈子所能接收到的信息量的总和。当今社会中除了信息量“多”以外&#xff0c;人们对信息处理的“效率”和“速度”的要求也越来越高。譬如&…

协议-http协议-基础概念01-发展历程-http组成-http是什么-相关的应用-相关的协议

发展历程-http组成-http是什么-相关的应用-相关的协议 参考来源&#xff1a; 极客时间-透视HTTP协议(作者&#xff1a;罗剑锋)&#xff1b; 01-HTTP的发展历程 1989 年&#xff0c;任职于欧洲核子研究中心&#xff08;CERN&#xff09;的蒂姆伯纳斯 - 李&#xff08;Tim Ber…

使用全局事件总线实现任意组件间的通讯

本文以vue2中爷孙组件通讯为例&#xff0c;需求是点击孙组件的按钮&#xff0c;实现关闭爷组件的弹窗。 全局事件总线是通过Vue实例的事件系统来实现组件之间的通讯&#xff0c;可以方便地在任何组件中进行事件的触发和监听。 以下是使用全局事件总线实现爷孙组件通讯的步骤&a…

Java 反射机制

​ 更多内容&#xff0c;前往IT-BLOG ​ 反射Reflection被视为动态语言的关键&#xff0c;反射机制允许程序在执行期间借助于Reflection API取得任何类的内部信息&#xff0c;并能直接操作任意对象的内部属性及方法。反射是一种功能强大且复杂的机制。使用它的主要人员是工具构…

登录页设计新选择:毛玻璃和新拟态风格,非2.5D和插画风

登录页给潜在用户传递了产品的品牌调性&#xff0c;是非常重要的一类页面&#xff0c;之前2.5D和插画风格的登录页流行一时&#xff0c;不过这阵风好像过去了&#xff0c;新的风格开始涌现了。 一、越来越流行的毛玻璃设计风格 毛玻璃风格是指将背景模糊处理&#xff0c;使得…

如何在 Linux 上使用 dmesg 命令

文章目录 1. Overview2.ring buffer怎样工作&#xff1f;3.dmesg命令4.移除sudo需求5. 强制彩色输出6.使用人性化的时间戳7.使用dmesg的人性化可读时间戳8.观察实时event9.检索最后10条消息10.搜索特定术语11.使用Log Levels12.使用Facility Categories13.Combining Facility a…

智慧物流之道:数据可视化引领全局监控

在智慧物流的背景下&#xff0c;数据可视化催生了物流管理的全新范式。首先&#xff0c;通过数据可视化&#xff0c;物流企业可以实现对整个供应链的全景式监控。下面我就可以可视化从业者的角度&#xff0c;简单聊聊这个话题。 首先&#xff0c;图表和地图的直观展示使决策者能…

Cyber RT 参数

以共享的方式实现不同节点之间数据交互的通信模式。 参数服务器是基于服务实现的&#xff0c;包含客户端和服务器端&#xff0c;服务端节点可以存储数据&#xff0c;客户端节点可以访问服务端节点操作数据&#xff0c;这个过程虽然基于请求响应的&#xff0c;但是无需自己实现…

linuxlsof详解

lsof 是 List Open File 的缩写, 它主要用来获取被进程打开文件的信息&#xff0c;我们都知道&#xff0c;在Linux中&#xff0c;一切皆文件&#xff0c;lsof命令可以查看所有已经打开了的文件&#xff0c;比如: 普通文件&#xff0c;目录&#xff0c;特殊的块文件&#xff0c;…

el-table 多选表格存在分页,编辑再次操作勾选会丢失原来选中的数据

el-table表格多选时&#xff0c;只需要添加type"selection"&#xff0c; row-key及selection-change&#xff0c;如果存在分页时需要加上reserve-selection&#xff0c;这里就不写具体的实现方法了&#xff0c;可以查看我之前的文章&#xff0c;这篇文章主要说一下存…

使用pytorch实现一个线性回归训练函数

使用sklearn.dataset 的make_regression创建用于线性回归的数据集 def create_dataset():x, y, coef make_regression(n_samples100, noise10, coefTrue, bias14.5, n_features1, random_state0)return torch.tensor(x), torch.tensor(y), coef 加载数据集&#xff0c;并拆分…

shader学习记录——融合、融球效果

融合、融球效果shader&#xff0c;重点在等势面公式上 Shader "Custom/MetaballsShader" {Properties{_MainTex ("Texture", 2D) "white" {}_Color("Color",Color) (1,1,1,1)}SubShader{Tags { "RenderType""Opaque…

什么是光谱共焦位移传感器?揭秘它隐藏的5大优势!

光谱共焦位移传感器是一种先进的传感技术&#xff0c;它利用光学原理来精确测量物体表面的微小位移。这种传感器结合了光谱学和共焦显微术的原理&#xff0c;通过分析反射光的光谱特性来确定物体表面的位置。 光谱共焦传感器的核心部件是光谱仪&#xff0c;它能够将反射光分解成…

【MQL】扩充Comment函数的功能

一、MQL语言中Comment函数的缺陷 Comment函数只能在图表上显示文本信息&#xff0c;无法将信息输出到日志文件或其他位置。Comment函数的文本信息会随着新的新的信息出现而更新&#xff0c;这可能导致就的信息被覆盖。Comment函数的文本信息长度有限&#xff0c;超过一定长度的…