C++11中的lambda、包装器(function、bind)

🐶博主主页:@ᰔᩚ. 一怀明月ꦿ 

❤️‍🔥专栏系列:线性代数,C初学者入门训练,题解C,C的使用文章,「初学」C++

🔥座右铭:“不要等到什么都没有了,才下定决心去做”

🚀🚀🚀大家觉不错的话,就恳求大家点点关注,点点小爱心,指点指点🚀🚀🚀

c++11中的lambda表达式

lambda表达式的基本格式

[capture list] (parameters) -> return_type {// 函数体
}

* capture-list:用于捕获外部变量,可以省略。捕获方式有三种:

    * [&]:以引用方式捕获所有外部变量。

    * [=]:以值的方式捕获所有外部变量。

    * [var1, var2, ...]:指定需要捕获的外部变量列表,可以使用 & 或 = 来指定捕获方式。

* parameter-list:函数参数列表,类似于普通函数的参数列表,可以省略。

* return-type:返回类型,可以省略,编译器可以自动推断。

* body:Lambda 函数体,类似于普通函数体,包含了执行的语句。

下面是一个简单的示例,展示了如何在 C++11 中使用 Lambda 表达式:

不使用捕捉列表 capture-list

#include <iostream>int main() {// Lambda 表达式示例:计算两个数的和//参数列表有两个整数auto add = [](int a, int b) -> int {return a + b;};// 调用 Lambda 表达式int result = add(3, 4);std::cout << "Result of add function: " << result << std::endl;// Lambda 表达式示例:打印 Hello World//参数列表为空auto printHello = []() {std::cout << "Hello, World!" << std::endl;};// 调用 Lambda 表达式printHello();return 0;
}

使用捕捉列表 capture-list

int main()
{int x=119,y=120;cout<<"x="<<x<<":"<<"y="<<y<<endl;//参数列表为空,调用时不需要传递参数auto f1=[&x,&y](){int temp;temp=x;x=y;y=temp;};//[]就是捕捉列表,可以捕捉lambda表达式所在函数(这里是main函数)里的变量,提供自己使用,这里采用的是引用捕捉x,y,因为我们要在lambda的函数体里修改x,y,如果不需要修改x,y的值时,可以采用值捕捉[x,y](){}f1();cout<<"x="<<x<<":"<<"y="<<y<<endl;return 0;
}

使用捕捉列表 capture-list的其他用法

int main()
{int x = 1,y = 2,z = 3;//以值的方式捕捉所有的变量auto f1=[=](){cout<<x<<y<<z<<endl;};//[=]是捕捉所有变量的意思f1();//以引用的方式捕捉所有的变量auto f2=[&](){cout<<x<<y<<z<<endl;};//[&]是捕捉所有变量的意思f2();//以值的方式捕捉所有的变量,指定x,y以引用捕捉auto f3=[=,&x,&y](){cout<<x<<y<<z<<endl;};f3();return 0;
}

lambda的底层其实是一个仿函数

包装器

function

function 是 C++ 标准库中的一个模板类,用于封装可调用对象,包括函数指针、函数对象、lambda 表达式等等,使用时需要functional头文件。

function 的定义如下:

template<class R, class... Args> class function<R(Args...)>;
 

其中 R 是返回类型,Args 是参数类型。通过这个定义,你可以创建一个 function 对象,它可以接受参数为 Args 类型,返回类型为 R 类型的可调用对象。

事例1)

void swap_func(int& r1,int& r2)
{int temp;temp=r1;r1=r2;r2=temp;
}struct swap_2
{void operator()(int& r1,int& r2){int temp;temp=r1;r1=r2;r2=temp;}
};
int main()
{int x=119;int y=120;auto lambdaswap=[](int& r1,int& r2){int temp;temp=r1;r1=r2;r2=temp;};//包装器指向swap_func函数function<void(int&,int&)> f1=swap_func;f1(x,y);cout<<"x:"<<x<<"    y:"<<y<<endl;//包装器指向仿函数function<void(int&,int&)> f2=swap_2();//swap_2() 是一个函数调用操作符 operator() 被重载的类 swap_2 的匿名对象。在 C++ 中,类的对象也可以被当作函数使用,如果该类定义了一个函数调用操作符 operator(),就可以像调用函数一样使用这个对象。在这种情况下,swap_2() 返回的匿名对象会被当作函数使用,具体来说,它会被当作一个函数对象使用。f2(x,y);cout<<"x:"<<x<<"    y:"<<y<<endl;//包装器指向lambda表达式function<void(int&,int&)> f3=lambdaswap;f3(x,y);cout<<"x:"<<x<<"    y:"<<y<<endl;return 0;
}

事例2)

class Test
{
public:int add(int x,int y){return x+y;}static int add_s(int x,int y){return x+y;}
};
int main()
{//包装器指向静态成员函数//需要加域名function<int(int,int)> f1=Test::add_s;int sum=f1(1,2);cout<<sum<<endl;//包装器指向普通成员函数//1.需要加域名//2.需要取地址//3.function需要多加一个类的指针(因为成员函数的参数列表中,隐含一个this指针)function<int(Test*,int,int)> f2=&Test::add;Test t1;int num=f2(&t1,1,2);cout<<num<<endl;
}

function封装可调用对象,包括函数指针、函数对象、lambda 表达式时,一定保证参数类型是相同的

bind

在C++中,std::bind 是一个函数模板,用于创建一个可调用对象,该对象可以绑定到函数、成员函数、函数对象或者其他可调用对象,并且可以指定部分或全部参数的值。std::bind 允许你在调用时提供缺少的参数,或者在调用时提供额外的参数。

bind 的基本语法如下:

template< class F, class... Args > 
/*unspecified*/ bind( F&& f, Args&&... args );

其中 F 是可调用对象的类型,args 是可调用对象的参数。bind 返回一个可调用对象,该对象可以通过调用其 operator() 来调用绑定的函数或函数对象,并传递给它们参数。

事例

class Test
{
public:int add(int x,int y){return x+y;}static int add_s(int x,int y){return x+y;}
};int sub(int x,int y)
{return x-y;
}int main()
{//调整参数顺序function<int(int,int)> f1=bind(sub,placeholders::_2,placeholders::_1);//bind第一个参数是函数名,placeholders::_2,placeholders::_1可用来改变参入参数的顺序的int num=f1(2,0);//顺序变为sub(0,2)cout<<num<<endl;//调整参数个数function<int(int)> f2=bind(sub,100,placeholders::_1);//我们也可以在绑定的时候,提前加入指定的参数,例如这里的100,这样我们调用sub时就只需要传一个参数int num1=f2(1);cout<<num1<<endl;//调整参数个数function<int(int,int)>f3=bind(&Test::add,Test(),placeholders::_1,placeholders::_2);//绑定的Test是一个自定义类型的普通成员函数,传函数名时需要加域名和&,这个Test()是Test的匿名对象,需要传递给this指针int num2=f3(2,3);cout<<num2<<endl;return 0;
}

  🌸🌸🌸如果大家还有不懂或者建议都可以发在评论区,我们共同探讨,共同学习,共同进步。谢谢大家! 🌸🌸🌸 

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

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

相关文章

CSS-浮动文字环绕布局、隐藏属性display、overflow、三角形制作、鼠标样式

文字环绕布局 CSS文字环绕布局是指在网页中让文字环绕在图片或其他元素周围的布局方式。这通常通过CSS中的float属性来实现。你可以将图片设置为float: left;或float: right;&#xff0c;然后在文本元素中使用clear属性来清除浮动&#xff0c;以确保文字不会覆盖图片。另外&am…

实用工具系列-git常用命令

作者持续关注 WPS二次开发专题系列&#xff0c;持续为大家带来更多有价值的WPS开发技术细节&#xff0c;如果能够帮助到您&#xff0c;请帮忙来个一键三连&#xff0c;更多问题请联系我&#xff08;WPS二次开发QQ群:250325397&#xff09;&#xff0c;摸鱼吹牛嗨起来&#xff0…

kylin v10 php源码安装后配置nginx

银河麒麟V10 源码编译安装php7.4 下载地址 https://www.php.net/distributions/php-7.4.33.tar.xz 安装依赖包&#xff0c;准备编译 dnf install libxml2-devel sqlite-devel bzip2-devel libcurl-devel libjpeg-turbo-devel freetype-devel openldap-devel libtool-devel p…

引领未来:杭州2024快递物流展共绘创新浪潮,塑造智慧物流新蓝图

杭州&#xff0c;作为中国的电商之都&#xff0c;近年来在快递物流行业背景与应用方面取得了显著的发展。随着电子商务的迅猛增长&#xff0c;杭州的快递物流行业迅速崛起&#xff0c;成为支撑电商产业发展的重要力量。 2024长三角&#xff08;杭州&#xff09;快递物流供应链与…

FFmpeg: 简易ijkplayer播放器实现--05ijkplayer–连接UI界面和ffplay.c

文章目录 ijkplayer时序图消息循环--回调函数实现播放器播放时状态转换播放停止 ijkmediaPlay成员变量成员函数 ijkplayer时序图 stream_open: frame_queue_init packet_queue_init init_clock 创建read_thread线程 创建video_refresh_thread线程 消息循环–回调函数实现 ui …

Go 之从标准输入读取数据的方法

最近刷题的时候&#xff0c;发现大家都喜欢用 bufio.Scanner 或 bufio.Reader 来从标准输入获取数据&#xff0c;遂来了解一下它们的特性。 文中为了调试方便&#xff0c;使用的 strings.NewReader("input string") 暂时替换 os.Stdin&#xff0c;实际从标准输入获取…

从吉客云到MySQL通过接口配置打通数据

从吉客云到MySQL通过接口配置打通数据 数据源系统:吉客云 吉客云是基于“网店管家”十五年电商ERP行业和技术积累基础上顺应产业发展需求&#xff0c;重新定位、全新设计推出的换代产品&#xff0c;从业务数字化和组织数字化两个方向出发&#xff0c;以构建流程的闭环为依归&am…

大数据入门之如何利用Phoenix访问Hbase

在大数据的世界里&#xff0c;HBase和Phoenix可谓是一对黄金搭档。HBase以其高效的列式存储和强大的数据扩展能力&#xff0c;成为大数据存储领域的佼佼者&#xff1b;而Phoenix则以其SQL化的操作方式&#xff0c;简化了对HBase的访问过程。今天&#xff0c;就让我们一起看看如…

Groovy快速入门

Groovy是一种面向对象的、动态类型的、基于JVM的编程语言&#xff0c;它与Java高度兼容&#xff0c;同时引入了许多简洁、灵活的语法特性&#xff0c;使得开发更为高效。以下是Groovy的快速入门指南&#xff1a; 一. 环境准备 1. 安装Java Development Kit (JDK) Groovy是基于…

学习笔记-微服务基础(黑马程序员)

框架 spring cloudspring cloud alibaba Eureka eureka-server 注册中心 eureka-client 客户端每30s发送心跳服务 服务消费者服务提供者 server 依赖 <dependency><groupId>org.springframework.cloud</groupId><artifactId>spring-cloud-star…

牛客挑战赛74(A,B,C,D)

比赛链接 这场纯纯shit&#xff0c;C是大讨论&#xff0c;D是大模拟。 A 硫酸钡之梦 思路&#xff1a; 发现我们到达第 i i i 个位置的时候&#xff0c;状态其实只有 3 3 3 个&#xff0c;取了的个数-未取的个数-1&#xff0c;0或1。而前面的选取方式不会影响到后面的选取…

Pandas部分应掌握的重要知识点

目录 Pandas部分应掌握的重要知识点一、DataFrame数据框的创建1、直接基于二维数据创建&#xff08;同时使用index和columns参数&#xff09;2、基于excel文件中的数据来创建 二、查看数据框中的数据和联机帮助信息1、查看特殊行的数据2、查看联机帮助的两种常见方法&#xff0…

JavaScript教程(八)--- 正则表达式

正则表达式 正则表达式是用于匹配字符串中字符组合的模式。在 JavaScript 中&#xff0c;正则表达式也是对象。这些模式被用于 RegExp 的 exec 和 test 方法&#xff0c;以及 String 的 match、matchAll、replace、search 和 split 方法。本章介绍 JavaScript 正则表达式。 创…

image with CV

""" 视觉&#xff1a;基本API应用&#xff08;OPENCV&#xff09; """ import cv2 import numpy as np"""图像读取方式3. 1.cv2.imread(filename or path, flags)flags0:灰度图像&#xff1b;flags1表示RGB图像&#xff1b;fl…

2024年mathorcup(妈妈杯)数学建模C题思路-物流网络分拣中心货量预测及人员排班

# 1 赛题 C 题 物流网络分拣中心货量预测及人员排班 电商物流网络在订单履约中由多个环节组成&#xff0c;图 ’ 是一个简化的物流 网络示意图。其中&#xff0c;分拣中心作为网络的中间环节&#xff0c;需要将包裹按照不同 流向进行分拣并发往下一个场地&#xff0c;最终使包裹…

JavaScript教程(十三)--- 使用 Promise

使用 Promise Promise 是一个对象&#xff0c;它代表了一个异步操作的最终完成或者失败。因为大多数人仅仅是使用已创建的 Promise 实例对象&#xff0c;所以本教程将首先说明怎样使用 Promise&#xff0c;再说明如何创建 Promise。 本质上 Promise 是一个函数返回的对象&…

《黑马点评》Redis高并发项目实战笔记(上)P1~P43

P1 Redis企业实战课程介绍 P2 短信登录 导入黑马点评项目 首先在数据库连接下新建一个数据库hmdp&#xff0c;然后右键hmdp下的表&#xff0c;选择运行SQL文件&#xff0c;然后指定运行文件hmdp.sql即可&#xff08;建议MySQL的版本在5.7及以上&#xff09;&#xff1a; 下面这…

ArrayList部分底层源码分析

JDK版本为1.8.0_271&#xff0c;以插入和删除元素为例&#xff0c;部分源码如下&#xff1a; // 部分属性 transient Object[] elementData; // 底层数组 private int size; // 记录元素个数 private static final Object[] DEFAULTCAPACITY_EMPTY_ELEMENTDATA {}; // 空Obje…

数据结构2:基于顺序表的通讯录项目

文章目录 头文件SeqList.hContact.h 实现文件SeqList.cContact.c 测试文件text.c 头文件 SeqList.h #pragma once#include<stdio.h> #include<stdlib.h> #include<assert.h> #include"Contact.h"#define INIT_CAPACITY 4//将顺序表数据类型调整为…

基于可变形卷积的大规模视觉基础模型的探索

基于可变形卷积的大规模视觉基础模型的探索 文章目录 基于可变形卷积的大规模视觉基础模型的探索一、简介二、亮点三、项目功能四、模型的应用1、图像模态任务性能2. 图文跨模态任务性能 五、源程序下载 一、简介 本模型包括大规模视觉基础模型"InternImage"&#x…