C++ :Lambda函数的浅学习

news2024/9/24 19:23:28

文章目录

  • 前言
  • 一、lambda函数实例
  • 总结


前言

lambda表达式又被称之为lambda函数,是c++11的新特性,下面我们看一下lambda表达式的参数等说明:

[函数对象参数](操作符重载函数参数)mutable或exception声明->返回值类型{

函数体

}

下面我们说明一下参数类型以及变量截取规则:

1.[函数对象参数]:捕捉列表。捕捉列表总是出现在lambda函数的开始处,[]是lambda函数的引出符,这个必须存在不可以省略。编译器会根据引出符判断接下来的代码是否是Lambda函数。捕捉列表能够捕捉上下文中的变量以供Lambda函数使用。

2.函数对象参数形式列表:

空。没有任何函数对象参数。

=。函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括Lambda所在类的this),并且是值传递方式(相当于编译器自动为我们按值传递了所有局部变量)。

&。函数体内可以使用 Lambda 所在范围内所有可见的局部变量(包括 Lambda 所在类的 this),并且是引用传递方式相当于是编译器自动为我们按引用传递了所有局部变量)。

this。函数体内可以使用 Lambda 所在类中的成员变量。

a。将 a 按值进行传递。按值进行传递时,函数体内不能修改传递进来的 a 的拷贝,因为默认情况下函数是 const 的,要修改传递进来的拷贝,可以添加 mutable 修饰符。

&a。将 a 按引用进行传递。
a,&b。将 a 按值传递,b 按引用进行传递。

=,&a,&b。除 a 和 b 按引用进行传递外,其他参数都按值进行传递。
&,a,b。除 a 和 b 按值进行传递外,其他参数都按引用进行传递

3.[操作符重载函数参数] : 标识重载的 () 操作符的参数,没有参数时,这部分可以省略,可以连同括号“()”一起省略。

参数可以通过按值(如: (a, b))和按引用 (如: (&a, &b)) 两种方式进行传递。

4.mutable 或 exception 声明 :mutable 可变变量,exception 异常

注:在使用该修饰符时,参数列表不可省略(即使参数为空);

5.[返回值类型] :返回类型,当不需要返回类型时(void),可以省略

6.[函数体] : 函数内容,可以使用上下文的数据。


一、lambda函数实例

#include <iostream>
using namespace std;
int main()
{
    auto func = [](){cout<<"hello Lambda"; };
    func();
}

 

 在上图中func就是一个lambda函数,我们使用auto来自动获取func的类型,这一步非常重要,当我们定义好lambda函数之后,就可以当正常函数来使用了。[]表示接下来定义lambda函数,正常情况下只要函数体所有return都是同一个类型的话,编译器就会自行判断函数的返回类型,也可以显式的指定lambda函数的返回类型,这就需要用到函数返回值后置的功能,比如下面这个代码:

[]()->int{return 1;}

 那么lambda函数有什么用呢?假如我们设计的一个类需要提供函数查询这个类,可能会根据多种情况查询,还有可能两者结合,我们如果为每个情况都写个函数,那么一定显得很冗余,这个时候就可以用lambda函数来实现这个功能,只需要提供一个接口让用户方便的自定义自己的查询方式。

Lambda函数和STL有什么关系呢?lambda函数的引入为STL的使用提供了极大的方便,就比如下面这个例子,以前我们想遍历一个vector的时候是下面这样的:

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
    vector<int>::iterator it = v.begin();
    for(auto ptr = it;ptr!=v.end();ptr++)
    {
      cout<<*ptr;
    }
}

当我们用lambda后变成了这样:

int main()
{
    vector<int> v;
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    v.push_back(4);
    v.push_back(5);
   for_each(v.begin(),v.end(),[](int val)
   {
           cout<<val;
   } );
}

 我们用lambda表达式这样的写法可以提高代码的执行效率,因为编译器有可能使用"循环展开"来加速执行过程。


总结

lambda 表达式就是一个函数(匿名函数),也就是一个没有函数名的函数。为什么不需要函数名呢,因为我们直接(一次性的)用它,嵌入式用的它,不需要其他地方调用它。lambda表达式也叫闭包。闭就是封闭的意思(封闭就是其他地方都不调用它),包就是函数。lambda表达式其实就是一个函数对象,他内部创建了一个重载()操作符的类。lambda的引入给我们带来了一种全新的编程体验,使我们从繁琐的语法中解放出来,更加关注于 “算法” 本身。

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

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

相关文章

EFI Driver Model(下)-USB 驱动设计

1、USB简介 通用串行总线&#xff08;英语&#xff1a;Universal Serial Bus&#xff0c;缩写&#xff1a;USB&#xff09;是一种串口总线标准&#xff0c;也是一种输入输出接口的技术规范&#xff0c;被广泛地应用于个人电脑和移动设备等信息通讯产品&#xff0c;并扩展至摄影…

ZLMediaKit流媒体服务器 RTSP推流时候的堆栈

先直接看图 这是ffmpeg向流媒体服务器推流时候的堆栈 引入C 11之后 堆栈会显得特别繁复冗余 看起来 也没有 以前没有C11之前那样 简单明了 太复杂了 标记下 很多函数名字被我改了 因为原来的看起来 同名函数太多了 C11 和lambada 匿名函数 让看堆栈 成了地狱模式 断点断在…

线程安全和线程不安全之chatgpt理解

对“线程安全”和“线程不安全”&#xff0c;我之前的常规理解是&#xff1a;线程安全&#xff1a;多线程对同一个数据或者容器进行访问或者处理&#xff0c;不会导致数据出现同步问题。线程不安全&#xff1a;多线程对同一个数据或者容器进行访问或者处理&#xff0c;会出现同…

【深度学习】【部署】Flask快速部署深度学习模型【入门】

【深度学习】【部署】Flask快速部署深度学习模型【入门】 提示:博主取舍了很多大佬的博文并亲测有效,分享笔记邀大家共同学习讨论 文章目录 【深度学习】【部署】Flask快速部署深度学习模型【入门】前言搭建简单的Web服务搭建深度学习的Web服务win10下打包成exe(选看)总结 前言…

web后端-请求响应

概述 我们之前在Spring写的 Java类&#xff0c;因为没有继承任何的接口 所以tomcat其实是不识别的&#xff0c;也不能直接运行 但是tomcat识别JavaEE的一项规范-Servlet,因为tomcat就相当于一个Servlet容器 SpringBoot底层提供了一个DisPatcherServlet类(实现了servlet接口)…

C++入门篇(一)

目录 一、C关键字汇总二、命名空间2.1 命名空间的定义2.2 命名空间的使用 三、C的输入和输出四、缺省参数五、函数重载5.1 函数重载的概念5.2 C支持函数重载的原理是什么&#xff1f; 一、C关键字汇总 在C98标准下&#xff0c;C一共有63个关键字&#xff0c;C语言一共有32个关…

第二章 设计模式七大原则

文章目录 前言一、单一职责 &#x1f367;1、单一职责原则注意事项和细节2、代码实现2、1 错误示例2、2 正确示例但有缺陷2、3 最终形态 二、接口隔离原则 &#x1f969;1、代码示例 三、依赖倒转原则 &#x1f965;1、代码示例2、依赖关系传递的三种方式 四、里氏替换原则 &am…

【C 语言】习题 1 - 用代码将二进制转换为十进制

目录 1、缘起 2、算法描述 3、代码清单 4、相关知识点 5、总结 1、缘起 我以前计算二进制转换为十进制的时候&#xff0c;喜欢用笔算&#xff0c;或者电脑在手旁的时候&#xff0c;用电脑自带的程序员计算器进行计算。今天兴起&#xff0c;突然想写一个代码用于计算…

Bootstrap框架实战:轻松搭建响应式网站

Bootstrap 是一款非常受欢迎的前端开发框架&#xff0c;它可以帮助我们轻松地搭建响应式网站。在这篇文章中&#xff0c;我们将介绍如何使用 Bootstrap 框架创建一个简单的响应式网站&#xff0c;并了解其核心概念和组件。 1. Bootstrap 简介 Bootstrap 是由 Twitter 公司的开…

字节码插桩:从分析class文件结构开始

作者&#xff1a;小马快跑 Class字节码 Java 能做到 一次编译&#xff0c;到处运行&#xff0c;主要就是靠 class字节码 文件&#xff0c;也就是 java 文件经过编译之后 .java -> .class&#xff0c;然后再被 JVM 虚拟机加载。其实&#xff0c;不仅是 java 语言&#xff0c…

每日做题总结——day02

目录 字符串处理函数&#xff0c;strcpy&#xff0c;strcat 数组指针 函数缺省值 初始化列表​编辑 友元函数 new与delete 静态成员变量 new与构造函数 delete与析构函数 拷贝构造函数的特点 常成员函数 初始化列表 编程题 字符串中找出连续最长的数字串 数组中超过…

字节的面试,你能扛住几道?

C &#xff0c; Python 哪一个更快&#xff1f; 读者答&#xff1a;这个我不知道从哪方面说&#xff0c;就是 C 的话&#xff0c;它其实能够提供开发者非常多的权限&#xff0c;就是说它能涉及到一些操作系统级别的一些操作&#xff0c;速度应该挺快。然后 Python 实现功能还…

从数据到应用 Web3不再纸上谈兵

继宣布拨款5000万港元加速推动Web3生态圈发展后&#xff0c;香港再次明确对Web3产业创新的支持。近日&#xff0c;香港Web3协会正式成立&#xff0c;创立Web3Hub基金&#xff0c;“东方之珠”正在大力推进第三代互联网的生态建设。 不仅仅是政策红利&#xff0c;ChatGPT等人工…

Web服务器配置(Tomcat)【Centos】

Tomcat 是一个轻量化服务器&#xff0c;理论上支持 20,000 个用户 LNMP&#xff1a;Linux Nginx MySQL LTMP&#xff1a;Linux Tomcat MySQL 1.Apache Tomcat 从版本7开始&#xff0c;若仅仅只需要部署HTML静态页面&#xff0c;Apache就可以完全够用 查看Apache是否安装 rpm -…

Ajax的特性以及用法

一、什么是Ajax 1、jQuery的Ajax ①&#xff1a;get方法​编辑 ②&#xff1a;post方法 ③&#xff1a;Ajax&#xff08;这个重要&#xff0c;jQuery的ajax最常用&#xff09; PS&#xff1a;一定要注意&#xff0c;数据类型是 json &#xff01;&#xff01;&#xff01; …

google breakpad中minidump_stackwalk的编译(Windows)

接上一篇的内容&#xff1a; breakpad编译指南&#xff08;Windows&#xff09;_我的胖是因为太膨胀的博客-CSDN博客 1、获取 googletest 放进 breakpad/src 目录下&#xff0c;并把目录名重命名为testing git clone https://github.com/google/googletest.git 如下图 2、把…

ROS2安装教程(virtualbox7.0.6+ROS2)

整个过程分两步&#xff1a;先安装Virtualbox&#xff0c;再安装ROS2 一、安装virtualbox7.0.6 网址&#xff1a;https://www.virtualbox.org/wiki/Downloads 问题1 安装时报错&#xff1a;缺少python core 、win32api依赖&#xff08;下图网上拷贝的图&#xff0c;版本忽略…

这份完整WhatsApp营销方案请收好!

WhatsApp是什么&#xff1f; WhatsApp是一种跨平台的即时通讯应用程序&#xff0c;可以在手机、平板电脑和电脑上使用。它允许用户发送文字消息、语音消息、图片、视频和文件等内容&#xff0c;同时还可以进行语音通话和视频通话。 WhatsApp拥有多种功能&#xff0c;包括但不…

Windows下通过CMake编译hiredis及应用

1、 在下载的redis-6.2.12.tar.gz的压缩包中&#xff0c;解压后有个deps文件夹&#xff0c;里面有个hiredis文件夹&#xff0c;是我们访问redis的C接口&#xff0c;需要我们手动编译后才能使用。&#xff08;redis: https://redis.io/download/&#xff09; 2、打开CMake软件&…

日本PSE认证日本的電気用品安全法METI备案

日本的電気用品安全法&#xff08;PSE认证&#xff09;法规要求日本的采购商在购进商品后一个月内必须向日本METI注册申报&#xff0c;并必须将采购商名称或ID标在产品上&#xff0c;以便在今后产品销售过程中进行监督管理&#xff0c;完成后将获得電気用品製造事業届出書&…