c++学习(lambda+bind)[27]

news2024/9/24 9:27:38

lambda

本质:编译器生成一个类
在这里插入图片描述
在这里插入图片描述
简单的lambda函数

int mian()
{
	//两个数相加的lambda
	auto add1 = [](int a, int b)->int{return a + b; };
	cout << add1(1, 2) << endl;
	//省略返回值
	auto add2 = [](int a, int b){return a + b; };
	cout << add2(1, 2) << endl;
	//交换变量的lambda
	int x = 0,  y = 1;
	auto swap1 = [](int& x1, int& x2)->void {int tmp = x1; x1 = x2; x2 = tmp; };
	swap1(x, y);
	cout << x << ":" << y << endl;

	auto swap2 = [](int& x1, int& x2)
	{
		int tmp = x1; 
		x1 = x2; 
		x2 = tmp; 
	};
	swap2(x, y);
	cout << x << ":" << y << endl;

	//不传参数交换x,y  lambda  --捕捉列表  (默认捕捉过来的变量不能修改 加mutable)
	//auto swap3 = [x, y]()mutable   //无修改作用
	auto swap3 = [&x, &y]()   //传引用捕捉
	{
		int tmp = x;
		x = y;
		y = tmp;
	};
	swap3();
	cout << x << ":" << y << endl;

	return 0;
}

lambda作为sort的参数(之前用反函数对象或者类型实现)

	sort(v.begin(), v.end(), [](const Goods& g1, const Goods& g2) {return g1._name <
	g2._name; });

传值

在这里插入图片描述

int mian()
{
	int a, b, c, d, e;
	a = b = c = d = e = 1;
	auto f1 = [=]() {  //传值补
		cout << a << b << c << d << e << endl;
	};

	return 0;
//打印不出结果 因为未调用f1
}

下面这样是不允序的,因为a已经是传值补了,不能再定义传值补

	auto f2 = [=, a]() {
		cout << a << b << c << d << e << endl;
	};

正确混合补

	auto f2 = [=, &a]() {
	a++;
		cout << a << b << c << d << e << endl;
	};

在这里插入图片描述
f1不能被f2赋值因为,f1和f2相当于不同的类,uuid不同,所以不能。可以给函数指针。

力扣150

class Solution {
public:
    int evalRPN(vector<string>& tokens) {
        stack<long long> st;
        map<string, function<long long(long long, long long)>> opFuncMap = 
        {
            {"+",[](long long a, long long b){return a+b;}},
            {"-",[](long long a, long long b){return a-b;}},
            {"*",[](long long a, long long b){return a*b;}},
            {"/",[](long long a, long long b){return a/b;}}
        };

        for(auto& str : tokens)
        {
            if(opFuncMap.count(str))  //操作符
            {
                long long right = st.top();
                st.pop();
                long long left=st.top();
                st.pop();
                st.push(opFuncMap[str](left,right));
            }else //操作数
            {
                st.push(stoll(str));
            }
        }
        return st.top();
    }
};

function 类型是 C++ 标准库中的一个模板类,定义在 <functional> 头文件中。

function 类型可以用来存储和调用各种类型的可调用对象,包括函数指针、函数对象、成员函数指针和 Lambda 表达式等。

在这个代码中,function<long long(long long, long long)> 是一个特定的 function 类型实例化,它表示一个接受两个 long long 类型参数并返回 long long 类型结果的函数。

通过包含 <functional> 头文件,我们可以使用 function 类型来定义变量、参数和返回值,以存储和调用各种类型的可调用对象。

当使用 std::function 存储类成员函数时,需要注意类参数传递的方式。由于成员函数需要一个类对象来调用,因此在使用 std::function 存储类成员函数时,需要将类对象作为参数传递给 std::function 对象。

下面是一个示例代码,演示了如何使用 std::function 存储类成员函数,并正确传递类对象作为参数:

#include <iostream>
#include <functional>

class MyClass {
public:
    int add(int a, int b) {
        return a + b;
    }
};

int main() {
    MyClass obj;
    std::function<int(MyClass&, int, int)> funAdd = &MyClass::add;

    int result = funAdd(obj, 3, 4);
    std::cout << "Result: " << result << std::endl;

    return 0;
}

在上面的示例中,我们定义了一个名为 MyClass 的类,其中包含了一个成员函数 add,用于将两个整数相加并返回结果。然后,我们创建了一个 MyClass 类的对象 obj,并将其作为参数传递给 std::function 对象 funAdd

通过使用 &MyClass::add 将成员函数的地址赋值给 funAdd,我们可以通过 funAdd 对象来调用 MyClass 类的成员函数 add。在调用 funAdd 时,我们将 obj 对象作为第一个参数传递,后面跟着两个整数参数。

bind绑定

对参数适配的适配器
在这里插入图片描述
在这里插入图片描述
第一个输出0,第二个输出5

std::bind 是 C++ 标准库中的一个函数模板,用于创建一个新的可调用对象,该对象将指定的函数或成员函数与一组参数绑定在一起。std::bind 可以用于实现参数绑定、参数重排序、固定函数参数等功能。

std::bind 的基本语法如下:

std::bind(func, arg1, arg2, ...)

其中,func 是要绑定的函数或成员函数,arg1, arg2, ... 是要绑定的参数。

下面是一些 std::bind 的使用示例:

示例 1:绑定普通函数

#include <iostream>
#include <functional>

int add(int a, int b) {
    return a + b;
}

int main() {
    auto add5 = std::bind(add, 5, std::placeholders::_1);
    int result = add5(3);
    std::cout << "Result: " << result << std::endl;
    
    return 0;
}

在上面的示例中,我们定义了一个名为 add 的普通函数,用于将两个整数相加并返回结果。然后,我们使用 std::bindadd 函数与参数 5 绑定在一起,创建了一个新的可调用对象 add5。在调用 add5 时,我们只提供一个参数 3,而 5 是已经绑定的参数。最终,我们将得到 5 + 3 = 8 的结果。

示例 2:绑定成员函数

#include <iostream>
#include <functional>

class MyClass {
public:
    int multiply(int a, int b) {
        return a * b;
    }
};

int main() {
    MyClass obj;
    auto multiply4 = std::bind(&MyClass::multiply, &obj, std::placeholders::_1);
    int result = multiply4(5);
    std::cout << "Result: " << result << std::endl;
    
    return 0;
}

在上面的示例中,我们定义了一个名为 MyClass 的类,其中包含了一个成员函数 multiply,用于将两个整数相乘并返回结果。然后,我们创建了一个 MyClass 类的对象 obj,并使用 std::bindmultiply 成员函数与参数 &obj 绑定在一起,创建了一个新的可调用对象 multiply4。在调用 multiply4 时,我们只提供一个参数 5,而 &obj 是已经绑定的参数。最终,我们将得到 5 * 4 = 20 的结果。

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

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

相关文章

国标GB28181视频监控EasyGBS接入大量通道,创建角色接口未响应

国标GB28181协议视频平台EasyGBS是基于国标GB28181协议的视频云服务平台&#xff0c;支持多路设备同时接入&#xff0c;并对多平台、多终端分发出RTSP、RTMP、FLV、HLS、WebRTC等格式的视频流。平台可提供视频监控直播、云端录像、云存储、检索回放、智能告警、语音对讲、平台级…

SAN共享存储架构

SAN共享存储架构 概述 近年在高性能专用存储网络需求的驱使下&#xff0c;许多SAN存储系统应用于高性能计算网络系统、大型网站系统、非线性编辑系统等网络系统中&#xff0c;存储设备与计算机主机系统之间一对一的关系&#xff0c;被可供多个计算机主机共享读写同一个存储设…

预测狗狗币价格 -- 机器学习项目基础篇(5)

Dogecoin(狗狗币)是一种加密货币&#xff0c;就像以太坊或比特币一样-尽管它与这两种着名的硬币完全不同。Dogecoin最初在某种程度上是作为加密爱好者的一个笑话&#xff0c;并从一个以前众所周知的模因中取了它的名字。 在本文中&#xff0c;我们将实现一个机器学习模型&#…

LabVIEW开发高压航空航天动力系统爬电距离的测试

LabVIEW开发高压航空航天动力系统爬电距离的测试 更多电动飞机MEA技术将发电&#xff0c;配电和用电集成到一个统一的系统中&#xff0c;提高了飞机的可靠性和可维护性。更多的电动飞机使用更多的电能来用电动替代品取代液压和气动系统。对车载电力的需求不断增加&#xff0c;…

科研统计图汇总

一、常用统计图 常用统计图的适用情况和举例说明如下&#xff1a; 比如&#xff1a;散点图适用于展示两个变量之间的关系情况&#xff1b;直方图适用于展示连续变量的分布情况&#xff0c;判断是否符合正态分布等&#xff1b;箱线图展示一组数据的中位数、四分位数、最大值、最…

未来穿戴上市进程终止:营收如乘“过山车”,大手笔分红遭问询

撰稿|行星 来源|贝多财经 近日&#xff0c;深圳证券交易所披露的信息显示&#xff0c;SKG母公司未来穿戴健康科技股份有限公司&#xff08;下称“未来穿戴”&#xff09;及其保荐人中信证券申请撤回发行上市申请文件。因此&#xff0c;深交所决定终止对其首次公开发行股票并在…

三相锁相环仿真与代码设计

文章目录 锁相环是锁住正弦电压波形的0度位置还是90度位置&#xff0c;欢迎大家参与讨论&#xff1f; 三相锁相环原理分析&#xff1a; 这里没有把Vq与零做差&#xff0c;PI控制器的参数应该负的。 首先对电网电压进行Clark 变换&#xff08; abc→αβ&#xff09;和Park 变…

计算机二级Python基本操作题-序号45

1. 键盘输入一组水果名称并以空格分隔&#xff0c;共一行。 示例格式如下&#xff1a; 苹果 芒果 草莓 芒果 苹果 草莓 芒果 香蕉 芒果 草莓 统计各类型的数量&#xff0c;从数量多到少的顺序输出类型及对应数量&#xff0c;以英文冒号分隔&#xff0c;每个类型行。输出结果保存…

电动汽车设计、制造、研发的学科、技术和前沿科技综述

引言&#xff1a;电动汽车作为替代传统燃油汽车的一种先进交通工具&#xff0c;不仅具有环保、低噪音等优势&#xff0c;而且对于能源消耗和气候变化等全球性问题也具有重要意义。本文将综述与电动汽车设计、制造、研发相关的学科、技术和前沿科技&#xff0c;以期对电动汽车领…

Linux环境下VS code的python与C++调试环境的安装

Linux环境下VS code的python与C调试环境的安装 文章目录 Linux环境下VS code的python与C调试环境的安装前言一、云服务器的环境二、VS code相关信息三、python 开发环境配置四、C开发环境配置1.测试main.cpp2.进行debug3.进行debug程序4.运行main.cpp程序步骤 前言 最近写的 C&…

除了PS,还有那些软件可以打开PSD文件

设计师在交接文件时&#xff0c;会看到各种格式的扩展文件&#xff0c;不同的格式需要不同的软件来运行。大多数人都听说过流行的文件格式PSD&#xff0c;因为它是最常用的图片格式之一&#xff0c;还有JPG、PNG等。然而&#xff0c;与JPG和PNG不同的是&#xff0c;PSD格式文件…

MySQL操作命令详解:增删改查

文章目录 一、CRUD1.1 数据库操作1.2 表操作1.2.1 五大约束1.2.2 创建表1.2.3 修改表1.2.3 删除表1.2.4 表数据的增删改查1.2.5 去重方式 二、高级查询2.1 基础查询2.2 条件查询2.3 范围查询2.4 判空查询2.5 模糊查询2.6 分页查询2.7 查询后排序2.8 聚合查询2.9 分组查询2.10 联…

云智慧x统信软件:智能化IT服务管理,提升客户服务价值

统信软件由中国领先的操作系统厂商于2019年联合成立&#xff0c;是全球主流的操作系统产品及服务提供商&#xff0c;致力于研发安全稳定、智能易用的操作系统产品&#xff0c;拥有统信UOS桌面版、服务器版、智能终端版在内的全栈基础设施&#xff0c;以及集中域管平台、企业级应…

Atcoder 做题记录

My OI Blog A R C 155 F \mathbb{ARC \ 155 \ F} ARC 155 F E, F 先咕着&#xff0c;做一些多项式题&#xff0c;这篇题解是我人工翻译的 [1] Double Counting 双重计数 考虑从叶子节点开始&#xff0c;用唯一的方式&#xff08;如果有的话&#xff09;来构造出一棵满足条件的树…

AMBA总线协议的终结者,一文稿定ACECHIAXI

无论你是IC设计工程师、验证工程师、FPGA工程师、还是微电子相关专业的学生&#xff0c;对于AMBA总线一定不陌生。 随着技术迭代的发展、基于各种复用IP的SoC芯片场景被高度使用&#xff0c;越来越多的人开始和总线互联打交道。 你肯定听说过AMBA、AHB、APB、AXI、ACE 一、A…

银河麒麟V10 SP1安装网络调试助手

文章目录 系统环境文件准备软件配置过程系统环境 系统镜像:Kylin-Desktop-V10-SP1-General-Release-2203-ARM64.iso 内核:5.4.18-53-generic 文件准备 网络调试助手可执行文件压缩包下载m-net-assist-arm64-main.zip 链接:https://pan.baidu.com/s/10Vu8Z6wOzCImXZWAW0Y…

USB采集卡如何打pts

一、使用采集卡提供的pts 二、手动打pts 1.usb采集设备pts的问题 2.采集卡驱动&#xff0c;UVC/UAC&#xff0c;ffmpeg的关系 3.如何自己打pts 4.音视频同步调优 5.NTP等联网调时工具带来的不同步问题 一、使用采集卡提供的pts 我们用使用pc摄像头和使用pc麦克风声卡里的方法&…

SQL分类及通用语法数据类型

一、SQL分类 DDL: 数据定义语言&#xff0c;用来定义数据库对象&#xff08;数据库、表、字段&#xff09;DML: 数据操作语言&#xff0c;用来对数据库表中的数据进行增删改DQL: 数据查询语言&#xff0c;用来查询数据库中表的记录DCL: 数据控制语言&#xff0c;用来创建数据库…

大数据技术之Hadoop:HDFS集群安装篇(三)

目录 分布式文件系统HDFS安装篇 一、为什么海量数据需要分布式存储 二、 分布式的基础架构分析 三、 HDFS的基础架构 四 HDFS集群环境部署 4.1 下载安装包 4.2 集群规划 4.3 上传解压 4.4 配置HDFS集群 4.5 准备数据目录 4.6 分发hadoop到其他服务器 4.7 配置环境变…

AlexNet卷积神经网络-笔记

AlexNet卷积神经网络-笔记 AlexNet卷积神经网络2012年提出 测试结果为&#xff1a; 通过运行结果可以发现&#xff0c; 在眼疾筛查数据集iChallenge-PM上使用AlexNet&#xff0c;loss能有效下降&#xff0c; 经过5个epoch的训练&#xff0c;在验证集上的准确率可以达到94%左右…