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; // 输出200return 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(); // 输出30return 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(); // 输出30return 0;
}

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

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

相关文章

202212青少年软件编程(Python)等级考试试卷(四级)

第 1 题 【单选题】 有n个按名称排序的商品,使用对分查找法搜索任何一商品,最多查找次数为 5 次, 则 n 的值可能为?() A :5 B :15 C :30 D :35 正确答案:C 试题解析: 对分查找最多查找次数m与个数之间 n 的关系是: n 对 2 的对数的取整后加 1,现在最多查找次数是…

LabVIEW如何实现多张图拼接

在LabVIEW中实现相机多次拍摄进行拼接的过程&#xff0c;可以分为以下几个步骤&#xff1a;设置相机参数、控制相机拍摄、图像处理与拼接、显示和保存结果。以下是一个详细的实现方案&#xff1a; 1. 设置相机参数 首先需要配置相机的参数&#xff0c;例如分辨率、曝光时间、…

Java Swing + MySQL图书借阅管理系统

系列文章目录 Java Swing MySQL 图书管理系统 Java Swing MySQL 图书借阅管理系统 文章目录 系列文章目录前言一、项目展示二、部分代码1.Book2.BookDao3.DBUtil4.BookAddInternalFrame5.Login 三、配置 前言 项目是使用Java swing开发&#xff0c;界面设计比较简洁、适合作…

Qt中信号和槽解决了什么问题

信号和槽解决了什么问题 Qt 中的信号和槽机制是一种用于处理对象之间通信的重要机制,它解决了以下几个问题: 对象之间的解耦(Decoupling): 问题: 在一个系统中,如果对象之间直接调用彼此的方法,就会形成紧密耦合的结构。这样的耦合使得对象难以独立地变更和维护,而且…

react-d3-tree:React组件创建交互式D3树形图

在这里插入代码片import React from "react"; import ReactDOM from "react-dom"; import Tree from "react-d3-tree";import "./styles.css";const myTreeData [{name: "Gaurang Torvekar",attributes: {keyA: "val …

【软考】2024年5月系统架构设计师考试感受

一 考试时间 5🈷️25日上午: 8点30-12点30: 综合知识和案例分析💚 5🈷️25日下午: 14点30-16点30: 论文📃 二 考试感受 2024年5月25日早上5点多一点,我就起床了👉🏻。简单洗漱后,就准备出门。可是,天呐,我的手机📱忘记充电了,所以就赶紧应急充会电😱…

基于Llama 3搭建中文版(Llama3-Chinese-Chat)大模型对话聊天机器人

前面两篇博文&#xff0c;我们分别在个人笔记本电脑部署了Llama 3 8B参数大模型&#xff0c;并使用Ollama搭建了基于 Web 可视化对话聊天机器人&#xff0c;可以在自己电脑上愉快的与Llama大模型 Web 机器人对话聊天了。但在使用过程中&#xff0c;笔者发现Llama大模型经常出现…

汇编一:汇编语言前的基础知识

计算机的工作原理就是取址执行,在哪儿执行呢,在cpu里面执行,从哪里面去取址呢?从内存中去取址,内存又被叫做存储器 可是,cpu和存储器是2个分开的硬件设备,那么是怎么做到把存储器里面的东西传给cpu呢,这就需要总线了 1.总线 总线一共可以分为3种, 一种是数据总线,一种是控制总…

OpenWrt U盘安装使用 详细教程 x86/64平台 软路由实测 系列一

1 官方稳定 版:OpenWrt 23.05 OpenWrt Downloads #根据实际情况选择 PC支持uefi,选择版本&#xff1a;https://downloads.openwrt.org/releases/23.05.3/targets/x86/64/openwrt-23.05.3-x86-64-generic-ext4-combined-efi.img.gz 2 rufus 制作U盘启动 3 制作好的U盘,接入主…

Redux基础

简介 状态管理工具&#xff0c;集中式管理react、vue、angular等应用中多个组件的状态&#xff0c;是一个库,使用之后可以清晰的知道应用里发生了什么以及数据是如何修改&#xff0c;如何更新的 在项目中添加 Redux 并不是必须的,根据项目需求选择是否引入 Redux 三个原则 …

Linux部分漏洞处理

1、ICMP timestamp请求响应漏洞 ICMP timestamp请求响应漏洞是指&#xff0c;当网络设备接收到ICMP timestamp请求时&#xff0c;它会返回当前时间戳作为响应&#xff0c;这可能导致设备的时间戳被暴露&#xff0c;进而可能被用于计算机时间戳协议&#xff08;TLS&#xff09;的…

PDF.js

什么是 PDF.js&#xff1f; PDF.js 是由 Mozilla 开发的一个用于呈现 PDF 文件的 JavaScript 库。它允许开发者将 PDF 文件直接嵌入到网页中&#xff0c;而无需使用插件或其他外部工具。PDF.js 使用 HTML5 技术&#xff0c;利用 Canvas 元素来呈现 PDF 内容&#xff0c;并提供…

基于集成经验模态分解的心电信号降噪和基于希尔伯特变换的R峰检测(MATLAB R2018)

近年来&#xff0c;心脏病已成为危害人类健康最常见的疾病。为了有效预防心脏疾病的发生&#xff0c;往往需要更加准确地采集与诊断心电信号&#xff0c;以便于更好地反映心脏情况。心电信号作为人体生理信号&#xff0c;对于识别心脏异常和心脏疾病具有重要的参考价值。心电信…

ubuntu如何安装gitlab runner

一、什么是GitLab Runner GitLab Runner 是 GitLab 提供的一个开源工具,用于在构建、测试和部署过程中执行作业。它是 GitLab 持续集成和持续部署(CI/CD)工作流的核心组件之一。 GitLab Runner 有以下主要功能: 作业执行:GitLab Runner 会接收来自 GitLab 的作业请求,并在指定…

ROS基础学习-ROS通信机制研究

研究ROS通信机制 研究ROS通信机制 0.前言1.话题通信1.1 理论模型1.2 话题通讯的基本操作1.2.1 C++1.2.2 Python0.前言 机器人是一种高度复杂的系统性实现,在机器人上可能集成各种传感器(雷达、摄像头、GPS…)以及运动控制实现,为了解耦合,在ROS中每一个功能点都是一个单独的…

从File类开始,学习Java文件操作

哈喽&#xff0c;各位小伙伴们&#xff0c;你们好呀&#xff0c;我是喵手。运营社区&#xff1a;C站/掘金/腾讯云&#xff1b;欢迎大家常来逛逛 今天我要给大家分享一些自己日常学习到的一些知识点&#xff0c;并以文字的形式跟大家一起交流&#xff0c;互相学习&#xff0c;一…

windows安装SQL Server

1、下载 下载网页&#xff1a;SQL Server 下載 | Microsoft 2022版下载地址&#xff1a;https://go.microsoft.com/fwlink/p/?linkid2215158&clcid0x404&culturezh-tw&countrytw 下载结果&#xff1a;SQL2022-SSEI-Dev.exe 打开选第三个&#xff0c;下载介质&…

自定义Linux命令,显示docker镜像、容器信息

1、修改环境变量&#xff08;仅对当前用户有效&#xff09; vim ~/.bashrc2、给命令取别名 alias dpsdocker ps --format "table{{.ID}}\t{{.Names}}\t{{.Status}}\t{{.Ports}}" alias disdocker images#保存并退出 :wq3、让配置重新生效 source ~/.bashrc4、测试&…

ChatGPT技术演进简介

chatGPT&#xff08;chat generative pre-train transformer&#xff0c; 可以对话的预训练trasformer模型&#xff09;&#xff0c;讨论点&#xff1a; 1、chatGPT为什么突然火了 2、GPT 1.0、2.0、3.0、3.5 、4和4o区别和特性&#xff0c;在不同应用场景中如何选对模型 3、未…

基于ESP8266的无线通信系统设计

本文介绍了一种基于ESP8266的无线通信系统设计方案。ESP8266是一款功能强大且成本低廉的WiFi模块&#xff0c;非常适合用于构建无线通信系统。本设计主要围绕ESP8266模块的功能特点&#xff0c;阐述了系统的硬件组成、软件设计以及实际应用示例。 关键词&#xff1a;ESP8266&a…