C++之lambda匿名函数总结(二百四十五)

news2024/9/25 9:38:57

简介: CSDN博客专家,专注Android/Linux系统,分享多mic语音方案、音视频、编解码等技术,与大家一起成长!

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀

人生格言: 人生从来没有捷径,只有行动才是治疗恐惧和懒惰的唯一良药.

更多原创,欢迎关注:Android系统攻城狮

欢迎关注Android系统攻城狮

1.前言

本篇目的:理解C++之lambda匿名函数用法总结。

2.C++11之lambda匿名函数实例总结

  • Lambda函数是C++11引入的一种匿名函数的方式,它可以在需要函数对象的地方快速定义一个临时的函数。Lambda函数的语法相对简洁,可以方便地捕获局部变量,并且可以作为参数传递给其他函数。

  • Lambda函数的基本语法如下:

[capture](parameters) -> return_type {
    // 函数体
}
  • 其中,capture是指捕获的变量列表,可以是空的、值传递方式或引用传递方式。parameters是形参列表,可以为空或包含一个或多个形参。return_type是返回类型,可以省略(根据函数体自动推断)或明确指定。函数体是具体的函数实现。

以下是Lambda函数的一些常见用法和特性:

  1. 捕获变量:Lambda函数可以通过捕获变量来访问其作用域外的变量。捕获方式包括值捕获(通过值传递方式访问变量)和引用捕获(通过引用传递方式访问变量)。

  2. 自动类型推断:Lambda函数可以根据函数体自动推断返回类型,也可以显式指定返回类型。

  3. 函数重载:Lambda函数可以像普通函数一样进行重载,可以有多个具有相同函数体的Lambda函数,只需在参数列表中有所区别即可。

  4. 内联调用:Lambda函数通常是在定义的地方即被调用,也可以将Lambda函数作为参数传递给其他函数进行调用。

  5. 使用标准算法库:Lambda函数经常与标准算法库中的函数(如sort、find_if、transform等)配合使用,提供灵活的函数对象。

3.C++11之lambda匿名函数实例

1. 捕获变量、按照特定规则排序

#include <iostream>
#include <vector>
#include <algorithm>

int main() {
    int a = 5;
    int b = 3;
    std::vector<int> nums = {2, 5, 1, 7, 3};

    // 捕获变量 a 和引用捕获变量 b,并按照特定规则排序
    std::sort(nums.begin(), nums.end(), [a, &b](int x, int y) {
        return a * x < b * y;
    });

    // 输出排序后的结果
    for (int num : nums) {
        std::cout << num << " ";
    }
    
    return 0;
}

2.自动类型推断并显式指定返回类型

#include <iostream>

int main() {
    // 自动类型推断的 Lambda 函数
    auto lambda1 = [](auto x, auto y) {
        return x + y;
    };

    // 显式指定返回类型的 Lambda 函数
    auto lambda2 = [](int x) -> int {
        return x * x;
    };

    // 使用 Lambda 函数进行计算并输出结果
    std::cout << "自动类型推断的结果:" << lambda1(3, 4) << std::endl;
    std::cout << "显式指定返回类型的结果:" << lambda2(5) << std::endl;

    return 0;
}

3. 函数重载并内联调用

#include <iostream>

// Lambda 函数重载
auto lambda1 = [](int x) -> int {
    return x * x;
};

auto lambda2 = [](double x) -> double {
    return x * x;
};

// 具体函数内联调用 Lambda 函数
inline void printSquare(int x, auto squareFunc) {
    std::cout << "调用的结果为:" << squareFunc(x) << std::endl;
}

int main() {
    int num1 = 5;
    double num2 = 2.5;

    printSquare(num1, lambda1); // 调用 lambda1 计算 num1 的平方
    printSquare(num2, lambda2); // 调用 lambda2 计算 num2 的平方

    return 0;
}

4.匿名函数内联调用

#include <iostream>

int main() {
    int num1 = 5;
    int num2 = 2;

    // 使用Lambda函数计算平方并输出结果
    auto printSquare = [&]() {
        int square1 = num1 * num1;  // 计算num1的平方
        int square2 = num2 * num2;  // 计算num2的平方
        
        std::cout << "num1的平方:" << square1 << std::endl;
        std::cout << "num2的平方:" << square2 << std::endl;
    };

    // 调用Lambda函数
    printSquare();

    return 0;
}

5.lambda 函数作为参数调用schedule 函数

#include <iostream>
#include <functional>
//schedule的参数没有返回值和参数
void schedule(const std::function<void()>& func) {
    func();

int main() {
  int x = 10;
  Scheduler scheduler;

  // 使用 lambda 函数作为参数调用 schedule 函数
  schedule([=] {
    std::cout << "The value of x is: " << x << std::endl;
  });
  return 0;
}

6.类中的lambda函数作为参数调用schedule 函数

#include <iostream>
#include <functional>

class Scheduler {
 public:
  //schedule的参数没有返回值和参数
  void schedule(const std::function<void()>& func) {
    func();
  }
 };

int main() {
  int x = 10;
  Scheduler scheduler;

  // 使用lambda成员函数作为参数调用schedule函数
  scheduler.schedule([=] {
  schedule([=] {
    std::cout << "The value of x is: " << x << std::endl;
  });
  return 0;
}

7.lambda函数作为参数调用schedule函数,并将返回值放在匿名回调函数中返回。

void schedule(const std::function<void(int x)>& func) {
    int ret = 100;
    func(100);
  }

int main() {
  int x = 10;

  //
  schedule([&](int y) {
    std::cout << "The value of x is: " << x << std::endl;
    std::cout << "The value of y is: " << y << std::endl;
  });
  return 0;
}

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

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

相关文章

基于springboot实现人事管理系统项目【项目源码+论文说明】

基于springboot实现人事管理系统演示 摘要 首先,论文一开始便是清楚的论述了系统的研究内容。其次,剖析系统需求分析,弄明白“做什么”,分析包括业务分析和业务流程的分析以及用例分析,更进一步明确系统的需求。然后在明白了系统的需求基础上需要进一步地设计系统,主要包罗软件…

WordPress简约响应式个人博客Kratos主题

Kratos主题基于Bootstrap和Font Awesome的WordPress一个干净&#xff0c;简单且响应迅速的博客主题 下载地址 qnziyw点cn/cmsmb/wordpress/6559点html 注意&#xff1a;点换成小数点就可以了

【lesson2】数据库的库操作

文章目录 库操作创建数据库删除数据库字符集和校验规则手动设置字符集和校验集不同字符集和校验集之间的区别修改数据库字符集和校验集备份和恢复数据库 库操作 创建数据库 删除数据库 字符集和校验规则 创建数据库的时候&#xff0c;有两个编码集&#xff1a; 1.数据库编码集…

数据结构与算法之矩阵: Leetcode 48. 旋转矩阵 (Typescript版)

旋转图像 https://leetcode.cn/problems/rotate-image/ 描述 给定一个 n n 的二维矩阵 matrix 表示一个图像。请你将图像顺时针旋转 90 度。你必须在 原地 旋转图像&#xff0c;这意味着你需要直接修改输入的二维矩阵。请不要 使用另一个矩阵来旋转图像。 示例 1 输入&…

tooltip实现悬停内容染色

一: 通过highlight.js项目实现对json字符串的染色高亮 此项目是jsp文件,并且引用了element-ui/highlight.js的组件 二: 实现效果 三: 代码实现 关键点在于成功引入相关的js及css&#xff0c;并且在tooltip渲染时进行数据染色。再将染色后的数据放到v-html中进行页面渲染(关键方…

智能视频监控平台EasyCVR级联后,上级平台如何获取下级的云端录像?

视频汇聚/视频云存储/集中存储/视频监控管理平台EasyCVR能在复杂的网络环境中&#xff0c;将分散的各类视频资源进行统一汇聚、整合、集中管理&#xff0c;实现视频资源的鉴权管理、按需调阅、全网分发、云存储、智能分析等。 有用户咨询&#xff0c;在EasyCVR级联上级时&#…

2023年香水行业数据分析:国人用香需求升级,高端香水高速增长

在人口结构变迁的背景下&#xff0c;“Z世代”作为当下我国的消费主力&#xff0c;正在将“悦己”消费推动成为新潮流。具备经济基础的“Z世代”倡导“高颜值”、“个性化”、“精致主义”&#xff0c;这和香水、香氛为代表的“嗅觉经济”的特性充分契合&#xff0c;因此&#…

字符设备驱动注册的本质及注册注销步骤,struct inode/file结构体作用

一、字符设备注册的本质及注册注销步骤 字符设备驱动注册的本质 只要某个信息存在于操作系统上&#xff0c;在操作系统中一定存在一个描述这个信息的对象&#xff0c;字符设备驱动注册进内核&#xff0c;在内核中一定会存在一个字符设备驱动对象保存当前的字符设备驱动的信息。…

【Unity】【VR】如何用键鼠模拟VR输入

【项目设置】 建立一个3D项目 Project Settings下最下方安装PlugIn Management&#xff0c;选中HMD 打开Windows->Package Manager->Unity Registry&#xff0c;列表下方XR Interaction Toolkit&#xff0c;点击Install&#xff0c;安装完成后再安装Sample&#xff0c…

北京等保测评:携手守护网络安全!

等保流程可以分为以下几个步骤&#xff1a;定级备案、初测及整改、测评和监督。 一、等保定级备案 根据《信息系统安全等级保护定级指南》和《信息安全等级保护管理办法》的要求&#xff0c;进行等保定级备案。包括以下几个步骤&#xff1a; 写信息安全管理制度&#xff0c;包括…

【Python学习】—Python基础语法(五)

【Python学习】—Python基础语法&#xff08;五&#xff09; 一、循环的嵌套使用 二、九九乘法表 #外层循环表示行数 for i in range(1,10):#内层循环表示每一行的数据for j in range(1,i1):#输出每一行的内容print(f"{i} * {j} {i * j} \t",end"") #外层…

2023 年最佳开源软件

InfoWorld 公布了 2023 年最佳开源软件榜单&#xff0c;旨在表彰年度领先的软件开发、数据管理、分析、人工智能和机器学习开源工具。 上榜的 25 个软件涵盖编程语言、运行时、应用程序框架、数据库、分析引擎、机器学习库、大型语言模型 (LLM)、用于部署 LLM 的工具等领域 Ap…

提升技能,挑战自我——一站式在线题库小程序

在这个信息爆炸的时代&#xff0c;我们总是在寻找一种方式&#xff0c;让自己在众多的知识海洋中快速提升技能&#xff0c;挑战自我。今天&#xff0c;我要向大家推荐一款全新的在线题库小程序KD蝌蚪阿坤&#xff0c;它将帮助你实现这个目标。 KD蝌蚪阿坤是一款全面的在线题库…

长城首款MPV上市,能否迎来「高山」时刻?

作者 | Amy 编辑 | 德新 去年下半年起&#xff0c;自主品牌接二连三抢占高端MPV市场&#xff0c;腾势D9、岚图梦想家、极氪009以及传祺E9等车型接连亮相。 国泰君安证券研究报告显示&#xff0c;新能源MPV 2021年、2022年年销量分别为4.4万和9.2万辆&#xff0c;今年上半年销…

Tp框架如何使用事务和锁,还有查询缓存

1.事务 在ThinkPHP框架中&#xff0c;可以使用think\db\Transaction类来实现事务。 use think\Db; use think\db\Transaction;// 开始事务 Db::startTrans();try {// 执行数据库操作Db::table(user)->where(id, 1)->update([name > John]);// 提交事务Db::commit(); }…

5、计算电机速度【51单片机控制步进电机-TB6600系列】

摘要&#xff1a;本节介绍用定时器定时的方式&#xff0c;精准控制脉冲时间&#xff0c;从而控制步进电机速度。 一、计算过程 电机每一步的角速度等于走这一步所花费的时间&#xff0c;走一步角度等于步距角&#xff0c;走一步的时间等于一个脉冲的时间&#xff1a; TB6600及…

Java中ThreadLocal对象的使用

目录 1、Threadlocal简介 2、ThreadLocal的主要方法&#xff1a; 2.1 initialValue()&#xff1a;初始化ThreadLocal变量的值 2.2 set()&#xff1a;为当前线程设置ThreadLocal变量的值 2.3 get()&#xff1a;获取当前线程中ThreadLocal变量的值 2.4 remove()&#xff1a…

精简版STC单片机串口程序(只有初始化和sendbyte)

摘要&#xff1a;本文分享两个函数构成的STC单片机串口发送程序&#xff0c;代码占用空间极小。不想调用stdio.h和printf但是还想用串口发送简单的调试信息&#xff1f;那就试试它吧&#xff01; 直接上代码 &#xff0c;核心函数只有2个&#xff0c;如下所示 void UartInit(v…

newstar week3 pwn

newstar week3 pwn 巩固知识&#xff0c;如有错误记得纠正&#xff0c;感谢师傅们的评阅 puts or system? Arch: amd64-64-little RELRO: Partial RELRO Stack: Canary found NX: NX enabled PIE: No PIE (0x400000)int __cdecl main(int argc, const…

springboot-scanBasePackages包扫描

目录 原因&#xff1a; 方式一&#xff1a; 方式二&#xff1a; 原因&#xff1a; 由于对rocketMq进行了一次封装&#xff0c;mq模块里面引用了RocketMQTemplate的bean&#xff0c;如果只引入jar包的依赖&#xff0c;启动的时候不会报错&#xff0c;但是在调用到 RocketMQT…