C++之lambda函数与std::bind区别及用法实例(二百八十)

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

优质专栏:Audio工程师进阶系列原创干货持续更新中……】🚀
优质专栏:多媒体系统工程师系列原创干货持续更新中……】🚀
优质视频课程:AAOS车载系统+AOSP14系统攻城狮入门实战课原创干货持续更新中……】🚀

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

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

欢迎关注Android系统攻城狮

🍉🍉🍉文章目录🍉🍉🍉

    • 🌻1.前言
    • 🌻2.Lambda函数与std::bind介绍
    • 🌻3.代码实例
      • 🐓3.1 Lambda函数示例
      • 🐓3.2 std::bind函数示例
      • 🐓3.3 Lambda函数和std::bind结合使用的示例

🌻1.前言

本篇目的:C++之lambda函数与std::bind区别及用法实例

🌻2.Lambda函数与std::bind介绍

  • C++11引入了lambda表达式,这是一种方便快捷的方式来创建匿名函数对象。Lambda函数在C++中非常有用,特别是在需要传递简短的函数作为算法的参数时,例如在std::sort或std::find_if等算法中。Lambda函数可以有参数,并且可以包含一个表达式或者一个花括号内的一系列语句。
  • Lambda函数的基本语法如下:
[捕获列表](参数列表) mutable -> 返回类型 {
    // 函数体
}
  • 捕获列表用于指定lambda函数如何从外部环境捕获变量。
  • 参数列表定义了函数的参数。
  • mutable修饰符允许在lambda函数中修改通过值捕获的变量。
  • 返回类型可以使用auto推断,或者显式指定。
  • 函数体由花括号包围,可以是单个表达式或者多条语句。
  • 例如,一个lambda函数,接受两个整数参数并返回它们的和:
auto add = [](int a, int b) -> int { return a + b; };
  • std::bind函数用于绑定一个可调用对象(如函数、成员函数、Lambda表达式等)到一个或多个参数。这使得你可以创建一个新的可调用对象,该对象在调用时会使用绑定参数。std::bind常用于回调函数和函数对象,当你需要以特定参数列表调用一个函数,但是又不希望直接传递所有的参数时。
  • std::bind的基本语法如下:
std::bind(可调用对象, 参数列表)
  • 可调用对象是要绑定的函数或Lambda表达式。

  • 参数列表是要传递给可调用对象的参数。

  • Lambda函数与std::bind的主要区别在于:

  1. Lambda表达式创建的是一个匿名函数对象,它可以独立使用,而std::bind返回的是一个新的可调用对象,它依赖于原始的可调用对象。
  2. Lambda表达式可以直接作为函数参数传递,而std::bind通常用于绑定成员函数,并且需要指定对象实例。
  3. Lambda表达式可以有返回类型,而std::bind返回的类型的确切形式取决于被绑定函数的返回类型和参数类型。
  • 总结来说,Lambda表达式和std::bind都是C++11中引入的有用特性,它们提供了不同的方式来创建和使用匿名函数。Lambda表达式适用于需要一个简单的匿名函数对象的场景,而std::bind适用于需要将函数绑定到特定参数列表并创建一个新的可调用对象的场景。

🌻3.代码实例

🐓3.1 Lambda函数示例

#include <iostream>

int main() {
    // 一个lambda函数,接受两个整数参数并返回它们的和
    auto add = [](int a, int b) -> int { return a + b; };

    // 使用lambda函数
    std::cout << add(10, 20) << std::endl; // 输出30

    // 一个捕获外部变量的lambda函数
    auto multiply = [x = 10](int y) -> int { return x * y; };
    std::cout << multiply(20) << std::endl; // 输出200

    return 0;
}

🐓3.2 std::bind函数示例

#include <iostream>
#include <functional>

class MyClass {
public:
    void myFunction(int a, int b) {
        std::cout << a + b << std::endl;
    }
};

int main() {
    MyClass obj;
    // 使用std::bind绑定成员函数
    auto boundFunction = std::bind(&MyClass::myFunction, &obj, 10, 20);
    boundFunction(); // 输出30

    return 0;
}

🐓3.3 Lambda函数和std::bind结合使用的示例

#include <iostream>
#include <functional>

class MyClass {
public:
    void operator()(int a, int b) {
        std::cout << a + b << std::endl;
    }
};

int main() {
    MyClass obj;
    // 使用lambda函数作为参数传递给成员函数
    auto memberLambda = [&obj](int a, int b) { obj(a, b); };

    // 使用std::bind将成员lambda函数绑定到成员函数
    auto boundMemberLambda = std::bind(memberLambda, 10, 20);
    boundMemberLambda(); // 输出30

    return 0;
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

AI网络爬虫-从当当网批量获取图书信息

工作任务和目标&#xff1a;用户输入一个图书名称&#xff0c;然后程序自动从当当网批量获取图书信息 查看相关元素在源代码中的位置&#xff1a; 第一步&#xff1a;在deepseek中输入提示词&#xff1a; 你是一个Python爬虫专家&#xff0c;一步步的思考&#xff0c;完成以下…

5.26机器人基础-DH参数 正解

1.建立DH坐标系 1.确定Zi轴&#xff08;关节轴&#xff09; 2.确定基础坐标系 3.确定Xi方向&#xff08;垂直于zi和zi1的平面&#xff09; 4.完全确定各个坐标系 例子&#xff1a; 坐标系的布局是由个人决定的&#xff0c;可以有不同的选择 标准坐标系布局&#xff1a; …

HAL库LED点灯

一、搭建开发环境 &#xff08;一&#xff09;安装MDK5 具体安装请参照下面链接&#xff1a;如何开始一个stm32的简单程序的编译_stm32程序编译-CSDN博客 &#xff08;二&#xff09;安装Jdk 由于STM32CubeMX需要用到JAVA&#xff0c;因此需要安装jdk环境。 jdk官网下载链接…

素数判断的奥秘与编程实践

新书上架~&#x1f447;全国包邮奥~ python实用小工具开发教程http://pythontoolsteach.com/3 欢迎关注我&#x1f446;&#xff0c;收藏下次不迷路┗|&#xff40;O′|┛ 嗷~~ 目录 一、素数定义的深入理解 二、非素数的例子与思考 三、素数判断的编程实现 1. 穷举法判断素…

protobuf —— 认识和安装

protobuf —— 认识和安装 什么是序列化和反序列化有哪些常见的什么是序列化和反序列化工具Protobuf安装安装依赖开始安装 连接动态库一些遗留问题 我们今天来看一个序列化和反序列化的工具&#xff1a;protobuf。 什么是序列化和反序列化 序列化&#xff08;Serialization&a…

基于SpringBoot和Mybatis实现的留言板案例

目录 一、需求及界面展示 二、准备工作 引入依赖 .yml文件相关配置 数据库数据准备 三、编写后端代码 需求分析 代码结构 Model Mapper Service Controller 前端代码 四、测试 一、需求及界面展示 需求&#xff1a; 1. 输入留言信息&#xff0c;点击提交&…

MySQL:图文超详细教程MySQL5.7下载与安装

一、前言 MySQL 5.7 是一个重要的数据库管理系统版本&#xff0c;它带来了多项改进和新特性&#xff0c;本文将超详细的带大家手动安装一下MySQL5.7。 二、下载MySQL5.7版本 MySQL5.7安装包 链接&#xff1a;https://pan.baidu.com/s/1lz5rp9PwfyeHzkEfI_lW6A 提取码&#…

MyBatis框架的使用:mybatis介绍+环境搭建+基础sql的使用+如何使用Map传入多个参数+返回多个实体用List或者Map接收+特殊sql的使用

MyBatis框架的使用&#xff1a;mybatis介绍环境搭建基础sql的使用如何使用Map传入多个参数返回多个实体用List或者Map接收特殊sql的使用 一、MyBatis介绍1.1 特性1.2 下载地址1.3 和其它持久层技术对比 二、搭建环境2.1配置maven2.2 创建mybatis配置文件2.3 搭建测试环境 三、基…

spring状态机实战

引言 完整代码库gitee地址:代码地址 一、什么是状态机 状态机是有限状态自动机的简称&#xff0c;是现实事物运行规则抽象而成的一个数学模型&#xff0c;是一种概念性机器&#xff0c;它能采取某种操作来响应一个外部事件。这种操作不仅能取决于接收到的事件&#xff0c;还…

如何使用Rust构建Python原生库?注意,不是动态链接库!!!

参考文档&#xff1a;https://github.com/PyO3/pyo3 创建python虚拟环境&#xff1a; conda create --name pyo3 python3.11.7激活虚拟环境&#xff1a; conda activate pyo3安装依赖&#xff1a; pip install maturin初始化项目&#xff1a; maturin init构建项目&#x…

搜索二叉树(C++)

文章目录 1. 搜索二叉树的概念2. 搜索二叉树结构的定义3. 搜索二叉树的操作3.1 搜索二叉树的插入3.2 搜索二叉树的删除3.3 搜索二叉树的查找 4. 完整代码 1. 搜索二叉树的概念 二叉搜索树&#xff08;Binary Search Tree&#xff0c;简称 BST&#xff09;&#xff0c;又称二叉…

Android Studio 获取 SHA1

以 debug.keystore 调试密钥库为例。 步骤1&#xff1a;明确 debug.keystore 位置 debug.keystore 在 .android 目录下&#xff1a; Windows 用户&#xff1a;C:\Users\用户名\.android\debug.keystore Mac 用户&#xff1a;/Users/用户名/.android/debug.keystore 假设我的…

在Windows中安装Redis

一、下载Redis github链接&#xff1a;https://github.com/redis-windows/redis-windows/releases 二、安装 解压后点击start.bat文件即可启动服务 新开一个cmd窗口进入安装了Redis的文件夹输入redis-cli.exe -h 127.0.0.1 -p 6379连接Redis&#xff0c;见如下结果便是成功&…

数据结构——链式二叉树知识点以及链式二叉树数据操作函数详解!!

引言&#xff1a;该博客将会详细的讲解二叉树的三种遍历方法&#xff1a;前序、中序、后序&#xff0c;也同时会讲到关于二叉树的数据操作函数。值得一提的是&#xff0c;这些函数几乎都是建立在一个函数思想——递归之上的。这次的代码其实写起来十分简单&#xff0c;用不了几…

【Springboot系列】SpringBoot 中的日志如何工作的,看完这一篇就够了

文章目录 强烈推荐引言Spring Boot 中的日志是怎么工作日志框架选择配置文件日志级别自定义日志配置集成第三方日志库实时监控和日志管理 Log4j2工作原理分析1. 核心组件2. 配置文件3. Logger的继承和层次结构4. 日志事件处理流程5. 异步日志 总结强烈推荐专栏集锦写在最后 强烈…

免费图片文字转换成文本,ocr文字识别软件免费版,真的太实用了!

截屏短视频上一段扎心文字&#xff0c;想把它发到朋友圈怎么办&#xff1f;这时候就需要一个OCR识别软件。 它就像一个聪明的小助手&#xff0c;它可以帮助电脑“看懂”书本上或者图片里的字。就像我们用眼睛看字一样&#xff0c;OCR软件用它的“眼睛”扫描图片&#xff0c;识…

C语言代码错误(一)

今天在写选择排序代码时&#xff0c;在测试数据发现不能显示结果 1、代码如下&#xff1a; #include <stdio.h>int main(void) {int i, j; // 循环变量int MinIndex; // 保存最小的值的下标int buf; // 互换数据时的临时变量int n;printf("你想输入多少个数据n:\n…

乐理学习-音及音名

1. 我觉得练习题很重要。我要得到一个反馈 所以我想没学习完书中的一节就要把练习题做下来&#xff0c;虽然慢点也可以。 2. 做个小计划。 今天计算了一下学完《基本乐理-李重光》如果每天3张。也要80天干完&#xff0c;希望能有一天可以学习7张的速度的时候。 3. 练习记录…

【除自身以外数组的乘积】python

目录 思路&#xff1a; 代码&#xff1a; 思路&#xff1a; 直接计算前缀乘积&#xff0c;后缀乘积&#xff0c;然后相乘即可 开始我还在想&#xff0c;遍历一次i&#xff0c;怎么能同时计算前缀乘积和后缀乘积&#xff0c;事实上分开计算比较方便。。 代码&#xff1a; cl…

Spark运行模式详解

Spark概述 Spark 可以在多种不同的运行模式下执行&#xff0c;每种模式都有其自身的特点和适用场景。 部署Spark集群大体上分为两种模式&#xff1a;单机模式与集群模式。大多数分布式框架都支持单机模式&#xff0c;方便开发者调试框架的运行环境。但是在生产环境中&#xff…