【C++技能树】Lambda表达式

news2024/10/4 10:20:03

在这里插入图片描述
Halo,这里是Ppeua。平时主要更新C++,数据结构算法,Linux与ROS…感兴趣就关注我bua!

文章目录

  • 0. Lambda表达式简介
  • 1. Lambda表达式
  • 2. Lambda表达式语法

在这里插入图片描述

0. Lambda表达式简介

在C++98及之前,想要对sort进行自定义排序,或者对自定义类型进行排序需要写一个仿函数。

例如,想要从大到小对num进行排序需要这样写

struct Greater{
    bool operator()(int x,int y)
    {
        return x>y;
    }
};
int main()
{
    vector<int>num;
    sort(num.begin(),num.end(),Greater());
}

为了一个可能只在全局中使用一次的函数来创建一个类得不偿失,也有点麻烦.所以引入了Lambda表达式

1. Lambda表达式

在C++11,引入了Lambda表达式来解决这个问题,其更像一种匿名函数.生命周期只在当前这一行

继续引用上文排序的例子,现在可以这样写

int main()
{
    vector<int>num;
    sort(num.begin(),num.end(),[](int x,int y){
        return x>y;
    });
}

仅需要一行即可完成该功能,该函数生命周期也仅在这一行.

这个表达式长得十分Python,是从Python那引用过来的特性

2. Lambda表达式语法

Lamda表达式总体框架

[capture-list](parameters)mutable ->return-type {
    {statement}
}
  1. statement:为函数体,正常写函数即可

  2. parameters:为参数列表

  3. mutable:可取消参数列表的常量属性

  4. return-type:return-type可由编译器自动推导可省略

  5. capture-list:参数捕获列表,可以理解为接下来可以在函数中使用哪些已有的变量

    • [var]表示复制某一个变量的值
    • [&var]表示引用某一个变量
    • [=]复制所有变量
    • [&]引用所有变量
    • [this]引用this指针

    这些可以进行一个组合,表示复制所有全局变量,仅引用a与b,不可重复引用

    [=,&a,&b](){
        
    }
    重复引用
    [=,a,b](){
        
    }
    

    一个引用了全局变量的例子

    int a=0,b=1;
    auto f1=[&,a]()mutable{
    a++,b++;
    };
    f1();
    cout<<a<<" "<<b;
    

    这里的结果为0,1.加上mutable是为了解决a为const的限制,即可对a进行自增的操作.

  6. Lambda表达式之间不可以互相赋值,即使看起来类型相同,但其背后的类型是不同的.我们用typeid来查看下

    auto f2=[](){cout<<"hello";return 0;};
    auto f1=[](){cout<<"hi";return 0;};
    cout<<"f2: "<<typeid(f2).name()<<endl;
    cout<<"f1: "<<typeid(f1).name();
    

image-20231023192508611

很明显其为不同的函数类型,所以不可以互相赋值

  1. 其底层为函数对象(仿函数)实现的,本质上没有什么差别

    image-20231023192650565
    image-20230905164632777

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

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

相关文章

手把手教你如何重装win10系统,自己动手安装系统其实很简单

笔者在这里写一个详细点的系统重装教程。手把手教大家如何从零开始重装win10系统。因为是写给新手来看的&#xff0c;会尽力介绍的详细一些。 文章较长&#xff0c;大家不用被吓到。简化一下具体步骤只有几步。顺利话一个小时内就可以安装好。我列了个目录&#xff1a; 一、重…

LVS负载均衡及LVS-NAT模式

一、集群概述 1.1 集群的背景 集群定义&#xff1a;为解决某个特定问题将多个计算机组合起来形成一个单系统 集群目的&#xff1a;为了解决系统的性能瓶颈 集群发展历史&#xff1a; 垂直扩展&#xff1a;向上扩展&#xff0c;增加单个机器的性能&#xff0c;即升级硬件 水…

【CNN-LSTM预测】基于卷积神经网络-长短期记忆网络的数据分类预测研究(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

ONEPIECE!程序环境和预处理——C语言最终章

时间过得飞快呀&#xff0c;从第一篇blog到现在&#xff0c;已经有三四个月的时间了&#xff0c;而我们终于也迎来了C语言的最终章——程序环境和预处理&#xff01;加油吧朋友们&#xff0c;ONEPIECE就在眼前~ 目录 一、程序的"翻译环境"和"运行环境" 二…

使用gen 结合gorm 生成表模型文件

# 创建一个目录 用于执行 自动生成model 的代码 和存储 生成的model文件 mkdir gengormmodel && cd gengormmodel go mod init gengormmodel go get -u gorm.io/genv0.3.16 #最终的目录结构package mainimport ("fmt""gorm.io/driver/mysql""…

【进程概念③】:进程环境变量/进程切换

深入篇【Linux】学习必备&#xff1a;进程环境变量/进程切换 Ⅰ.环境变量Ⅱ.深层意义Ⅲ.全局属性Ⅳ.进程切换 Ⅰ.环境变量 1.环境变量是什么&#xff1f;&#xff1a;环境变量是系统提供的一组name/value形式的变量&#xff0c;不同的环境变量有不同的用户。 一般是用来指定操作…

AIGC笔记--基于DDPM实现图片生成

目录 1--扩散模型 2--训练过程 3--损失函数 4--生成过程 5--参考 1--扩散模型 完整代码&#xff1a;ljf69/DDPM 扩散模型包含两个过程&#xff0c;前向扩散过程和反向生成过程。 前向扩散过程对一张图像逐渐添加高斯噪声&#xff0c;直至图像变为随机噪声。 反向生成过程…

--initialize specified but the data directory has files in it. Aborting. 问题解决

当电脑输入这条命令以试图初始化数据库的时候&#xff0c;出现这样的错误。 2023-10-23T09:04:21.258180Z 0 [Warning] TIMESTAMP with implicit DEFAULT value is deprecated. Please use --explicit_defaults_for_timestamp server option (see documentation for more deta…

Spark SQL概述与基本操作

目录 一、Spark SQL概述 &#xff08;1&#xff09;概念 &#xff08;2&#xff09;特点 &#xff08;3&#xff09;Spark SQL与Hive异同 &#xff08;4&#xff09;Spark的数据抽象 二、Spark Session对象执行环境构建 (1)Spark Session对象 &#xff08;2&#xff09;代码演…

Python-字符串(切片操作与内建函数)

目录 一、字符串介绍 1、什么是字符串 2、转义字符 二、字符串的输入和输出 1、字符串输出 2、字符串输入 三、访问字符串中的值 1、字符串的存储方式 2、使用切片截取字符串 四、字符串内建函数 1、find 2、index 3、count 4、replace 5、split 6、capitalize …

Centos 7 Zabbix配置安装

前言 Zabbix是一款开源的网络监控和管理软件&#xff0c;具有高度的可扩展性和灵活性。它可以监控各种网络设备、服务器、虚拟机以及应用程序等&#xff0c;收集并分析性能指标&#xff0c;并发送警报和报告。Zabbix具有以下特点&#xff1a; 1. 支持多种监控方式&#xff1a;可…

Docker容器引擎的介绍

目录 Docker概述 容器受欢迎的原因 Docker与虚拟机的区别 Docker三个核心概念 Docker的安装 1、环境准备 2、安装依赖包 3、设置阿里云镜像源 4、安装 Docker-CE并设置为开机自动启动 Docker命令 1、查看 docker 版本信息 2、docker 信息查看 3、Docker 镜像操作命…

GoLong的学习之路(五)语法之数组

书接上回&#xff0c;上回书说到&#xff0c;循环语句&#xff0c;在go中循环语句的少了whlie这个关键词&#xff0c;但是与之for可以改这个改这个特点。并且在终止关键词中&#xff0c;又有标签可以方便&#xff0c;停止。这次说数组 文章目录 Array(数组)数组的初始化方法一方…

数据结构堆详解

[TOC]堆详解 一&#xff0c;堆 1.1堆的概念 堆的性质&#xff1a; 堆中某个节点的值总是不大于或不小于其父节点的值&#xff1b; 堆总是一棵完全二叉树。 1.2堆的存储模式 我们前面的文章提到过&#xff0c;二叉树的两种存储模式&#xff0c;一个是顺序存储&#xff0c;一…

网络第一颗

✍ 如何理解局域网和广域网&#xff1f; ✍ 路由器和交换机是怎样工作的&#xff1f; ✍ 三层交换机能不能代替路由器&#xff1f; -- 1.局域网 2. 广域网 -- -- 企业网络 运营商架构 数据中心架构 -- 局域网 - 内网 - 私网 -- 通过交换机连接的 转发相同IP地址段的…

NVIDIA显卡算力表--nvidia显卡算力表

参考链接&#xff1a;https://blog.csdn.net/qq_41070955/article/details/108269915 官方链接&#xff1a;https://developer.nvidia.com/cuda-gpus

电压放大器在工业领域有哪些用途

电压放大器在工业领域中有广泛的应用&#xff0c;其主要功能是将传感器或其他信号源的微小电压信号放大为更大幅度的电压信号&#xff0c;以便进行后续的信号处理、控制和监测。以下是电压放大器在工业领域中的一些常见用途&#xff1a; 传感器信号放大&#xff1a;工业生产中经…

Java 通过反射修改字符串 String 类型变量的取值而不改变字符串变量的指向

注意点 由于 JDK 8 中有关反射相关的功能自从 JDK 9 开始就已经被限制了&#xff0c;如&#xff1a;通过反射修改 String 类型变量的 value 字段(final byte[])&#xff0c;所以要能够使用运行此方法&#xff0c;需要在运行项目时&#xff0c;添加虚拟机(VM)选项&#xff1a;-…

map set 使用快速上手【C++】

目录 一&#xff0c;关联式容器 二&#xff0c;键值对 三&#xff0c;set 1&#xff09;使用参考此文档 2&#xff09;count 函数 3&#xff09;multiset类 四&#xff0c;map 1. 模板参数介绍 2.operator[]介绍 3. multimap 英语比较好的同学可以自行查找文档 学…

springboot+avue框架开发的医院绩效考核系统全套源码

医院综合绩效核算系统全套源码 &#xff08;应用案例自主版权演示&#xff09; 医院绩效考核系统以医院的发展战略为导向&#xff0c;把科室、员工的绩效考核跟战略发展目标紧密结合&#xff0c;引导医院各个科室、各员工的工作目标跟医院的发展目标结合在一起&#xff0c;实现…