适配器详解

news2024/10/6 4:11:55

目录

1、适配器简介

2、函数对象适配器

​编辑

3、函数指针作为适配器 ptr_fun

​编辑

4、类中的成员函数作为适配器 mem_fun_ref

5、取反适配器

5.1、not1 一元取反适配器

​编辑

5.2、not2 二元取反适配器


1、适配器简介

适配器 为算法 提供接口
目前的适配器最多能扩展一个参数,而不是想当然扩展几个就几个

2、函数对象适配器

仿函数作为适配器,就叫做函数对象适配器

适配器详解

#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
#if 1

//第二步:公共继承binary_function   参数萃取
class PrintInt:public binary_function<int,int,void>
{
public:
    //第三步:整个函数加const修饰
    void operator()(int value, int tmp) const
    {
        cout<<"value="<<value<<" tmp="<< tmp<<endl;
    }
};

void test01()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);

    //for_each 提取容器的每个元素
    //第一步bind2nd 或bind1st
    //bind2nd将100绑定到第二个参数tmp行 容器的元素在value上
    for_each(v1.begin(), v1.end(), bind2nd(PrintInt(), 100) );
    cout<<endl;
}

int main(int argc, char *argv[])
{
    test01();
    return 0;
}
#else
#endif

for_each 只是负责提取容器中的每一个元素,但是真正输出还是要依靠 仿函数(仿函数根据函数重载或者自定义普通函数提供策略——输出每一个元素还是按要求查找元素等) 

仿函数详解

函数对象作为适配器的步骤:

(1)、第一步:使用 bind2nd 或bind1st 绑定第一个或者第二个参数,另一个编译器自动解析传递参数

(2)、第二步:在仿函数上公共继承binary_function 参数萃取

(3)、第三步:整个函数加const修饰

3、函数指针作为适配器 ptr_fun

普通函数作为适配器,因为 在 c 中函数名本身代表的就是函数的入口地址(函数指针:本质是指针变量,但是该变量保存的是函数的入口地址)

但是在 c++ 中我们不能把 函数名 作为函数指针,所以函数名不能成为函数的入口地址,因为 在 c++中 函数的真实入口地址是 函数名+形参+类型,这就是函数重载的来由。所以这个时候就需要将 函数名 使用 ptr_fun 变为函数的入口地址——函数指针,不然函数名充当不了函数指针

然后将多余的参数和 函数指针进行绑定就好

具体代码如下

void myPrintInt(int value, int tmp)
{
    cout<<"value="<<value<<" tmp="<< tmp<<endl;
}
void test02()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);

    //for_each 提取容器的每个元素
    for_each(v1.begin(), v1.end(), bind2nd(ptr_fun(myPrintInt),100) );
    cout<<endl;
}
int main(int argc, char *argv[])
{
    test01();
    return 0;
}

4、类中的成员函数作为适配器 mem_fun_ref

&Data::printInt 是取该类中成员函数的入口地址,如果有多个同名函数,那么 &Data::printInt 表示的就是 同名函数的起始位置
class Data
{
public:
    int data;
public:
    Data(){}
    Data(int d){
        data = d;
    }
    void printInt(int tmp)
    {
        cout<<"value="<<data+tmp<<endl;
    }
};

void test03()
{

    vector<Data> v1;
    v1.push_back(Data(10));
    v1.push_back(Data(30));
    v1.push_back(Data(50));
    v1.push_back(Data(70));
    v1.push_back(Data(90));

    //for_each 提取容器的每个元素
    for_each(v1.begin(), v1.end(), bind2nd(mem_fun_ref(&Data::printInt),100) );
    cout<<endl;
}

int main(int argc, char *argv[])
{
    test03();
    return 0;
}

5、取反适配器

5.1、not1 一元取反适配器

找出比 30 小的数

void test04()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(30);
    v1.push_back(50);
    v1.push_back(70);
    v1.push_back(90);

    vector<int>::iterator ret;
    ret = find_if(v1.begin(), v1.end(), not1(bind2nd(greater<int>(), 30))  );
    if(ret != v1.end())
    {
        cout<<"找到相关数据:"<<*ret<<endl;
    }
}


int main(int argc, char *argv[])
{
    test03();
    return 0;
}

5.2、not2 二元取反适配器

 lambda 表达式 c++11才支持    
 
 []里面啥都不写 lambda不能识别 外部数据    

 [=] lambda能对 外部数据 读操作    

 [&] lambda能对 外部数据 读写操作
void test05()
{
    vector<int> v1;
    v1.push_back(10);
    v1.push_back(40);
    v1.push_back(50);
    v1.push_back(20);
    v1.push_back(30);

    //lambda 表达式 c++11才支持
    //[]里面啥都不写 lambda不能识别 外部数据
    //[=] lambda能对 外部数据 读操作
    //[&] lambda能对 外部数据 读写操作
    for_each(v1.begin(), v1.end(), [&](int val){
        cout<<val<<" ";
    } );
    cout<<endl;

    sort(v1.begin(), v1.end(),not2(greater<int>()));

    for_each(v1.begin(), v1.end(), [&](int val){
        cout<<val<<" ";
    } );
    cout<<endl;
}

int main(int argc, char *argv[])
{
    test05();
    return 0;
}

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

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

相关文章

第一次习题总结

目录 求第K个数 求逆序对的数量 数的三次方根 一维前缀和 二维前缀和&#xff08;子矩阵的和&#xff09; 求第K个数 思路&#xff1a;用快速选择&#xff0c;时间复杂度为O(N) sl和sr是左边和右边数的个数&#xff0c;当k<sl&#xff0c;即倒数第K个数在左边范围内&#x…

【JY】减隔震设计思考:隔震篇

【写在前文】随着隔标颁布&#xff0c;国内外大大小小的地震的经历。越来越多的人重视减隔震分析和设计&#xff0c;也听到不少的疑惑声音&#xff0c;个人也有一点热点问题的感悟与大家分享。在个人看来&#xff1a;建筑减隔震&#xff1a;七分构造三分算&#xff01;特别注意…

[Netty源码] Netty轻量级对象池实现分析 (十三)

文章目录1.对象池技术介绍2.如何实现对象池3.Netty对象池实现分析3.1 Recycler3.2 Handler3.3 Stack3.4 WeakOrderQueue3.5 Link4.总结1.对象池技术介绍 对象池其实就是缓存一些对象从而避免大量创建同一个类型的对象, 类似线程池。对象池缓存了一些已经创建好的对象, 避免需要…

uni-app--》什么是uniapp?如何开发uniapp?

&#x1f3cd;️作者简介&#xff1a;大家好&#xff0c;我是亦世凡华、渴望知识储备自己的一名在校大学生 &#x1f6f5;个人主页&#xff1a;亦世凡华、 &#x1f6fa;系列专栏&#xff1a;uni-app &#x1f6b2;座右铭&#xff1a;人生亦可燃烧&#xff0c;亦可腐败&#xf…

企业电子招投标采购系统源码——功能模块功能描述+数字化采购管理 采购招投标

​ 功能模块&#xff1a; 待办消息&#xff0c;招标公告&#xff0c;中标公告&#xff0c;信息发布 描述&#xff1a; 全过程数字化采购管理&#xff0c;打造从供应商管理到采购招投标、采购合同、采购执行的全过程数字化管理。通供应商门户具备内外协同的能力&#xff0c;为外…

HTTP API接口设计规范

1. 所有请求使用POST方法 使用post&#xff0c;相对于get的query string&#xff0c;可以支持复杂类型的请求参数。例如日常项目中碰到get请求参数为数组类型的情况。 便于对请求和响应统一做签名、加密、日志等处理 2. URL规则 URL中只能含有英文&#xff0c;使用英文单词或…

Docker配置DL envs教程

Docker容器与镜像的区别 Docker镜像类似于虚拟镜像&#xff0c;是一个只读的文件&#xff0c;包括进程需要运行所需要的可执行文件、依赖软件、库文件、配置文件等等。 而容器则是基于镜像创建的进程&#xff0c;可以利用容器来运行应用。 总结来说&#xff0c;镜像只读&#…

贾俊平《统计学》第七章知识点总结及课后习题答案

一.考点归纳 参数估计的基本原理 1置信区间 &#xff08;1&#xff09;置信水平为95%的置信区间的含义&#xff1a;用某种方法构造的所有区间中有95%的区间包含总体参数的真值。&#xff08;2&#xff09;置信度愈高&#xff08;即估计的可靠性愈高&#xff09;&#xff0c;则…

ABeam News | ABeam Consulting 荣获『SAP AWARD OF EXCELLENCE 2023』奖项

ABeam Consulting株式会社&#xff08;总裁兼CEO 鸭居 达哉、东京都千代田区、以下简称为ABeam Consulting&#xff09;在SAP 日本株式会社&#xff08;董事长 铃木洋史、东京都千代田区、以下简称为SAP日本&#xff09;表彰优秀合作伙伴的颁奖『SAP AWARD OF EXCELLENCE 2023』…

c3p0报错java.lang.NoClassDefFoundError: com/mchange/v2/ser/Indirector

1. 问题由来 今天第一次学习到c3p0的时候&#xff0c;学习资料上使用的是0.9.1.2版本。 我偷懒使用的是0.9.2版本。但是运行的时候会报错&#xff1a; 网上搜索了一下这个错误&#xff0c;很多人说去安装mchange-commons-0.2.jar 这个包 但是我看学习资料上没有去另外安装这…

nodejs+vue 图书借阅管理系统

该系统的应用可以减少工作人员的劳动强度&#xff0c;提高工作效率与管理水平&#xff0c;具有很大的价值。它可以使图书这项借阅业务操作简单&#xff0c;成功率高&#xff0c;使网上图书管理系统的管理工作向一个新的层次迈进。本论文是以构建图书借阅为目标&#xff0c;使用…

《100天精通Python丨从快速入门到黑科技》 >>> 目录导航

文章目录一、100 天精通 Python 丨基础知识篇100 天精通 Python 丨基础知识篇 —— 01、C 站最全 Python 标准库总结100 天精通 Python 丨基础知识篇 —— 02、Python 和 Pycharm&#xff08;语言特点、学习方法、工具安装&#xff09;100 天精通 Python 丨基础知识篇 —— 03、…

基于AIGC的3D场景创作引擎概述

通过改变3D场景制作流程复杂、成本高、门槛高、流动性差的现状&#xff0c;让商家像玩转2D一样去玩转3D&#xff0c;让普通消费者也能参与到3D内容创作和消费中&#xff0c;真正实现内容生产模式从PGC/UGC过渡到AIGC&#xff0c;是我们3D场景智能创作引擎一直追求的目标。前言随…

【VMD-SSA-LSSVM】基于变分模态分解与麻雀优化Lssvm的负荷预测【多变量】(Matlab代码实现)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

【C++基础】引用(引用的概念;引用的特性;常引用;使用场景:做输出型参数、大对象传参、做输出型返回值、返回大对象的引用);引用和指针的区别)

六、引用 6.1 引用的概念 引用不是新定义一个变量&#xff0c;而是给已存在变量取了一个别名&#xff0c;编译器不会为引用变量开辟内存空间&#xff0c;它和它引用的变量共用同一块内存空间。&#xff08;语法上&#xff09; 格式&#xff1a;类型& 引用变量名(对象名) …

矮床酸阻滞技术及其在酸回收行业的应用

废酸是如何产生的&#xff1f; 为什么要进行废酸回收&#xff1f; 在轧钢厂在轧制过程中&#xff0c;铁与氧或铁与燃料燃烧时的生成物(CO2、H2O等)的化学作用&#xff0c;而形成一层氧化层&#xff0c;称为氧化皮。其实我们日常生活中接触到的金属件&#xff0c;尤其是铁件上的…

mmsegmentation 训练自己的数据集

一. MMSegmentation是什么&#xff1f; MMSegmentation 是一个基于 PyTorch 的语义分割开源工具箱&#xff0c;它是 OpenMMLab 项目的一部分。他与MMDetection类似&#xff0c;集成了各种语义分割算法&#xff0c;可以快速验证语义分割效果。 二. 环境准备 参考&#xff1a…

【C++】模版(一)

泛型编程、模版&#xff08;一&#xff09;&#xff1a; 1.泛型编程&#xff1a; void Swap(int& left, int& right) {int temp left;left right;right temp; } void Swap(double& left, double& right) {double temp left;left right;right temp; }【…

电脑软件:office文档密码了怎么办,看完你就能自己找回了

Word、Excel、PPT作为大家日常办公的使用最频繁的办公软件。对于一些涉及个人隐私或者涉及企业机密性的文档文件&#xff0c;我们经常会给自己的文档加上密码。 但有时候文档时间比较久了、或者密码太多了&#xff0c;有时候我们会把文档的密码给忘记了&#xff0c;如果密码忘…

Shell练习

一、题目 1、编写函数&#xff0c;实现打印绿色OK和红色FAILED 判断是否有参数&#xff0c;存在为Ok&#xff0c;不存在为FAILED 2、编写函数&#xff0c;实现判断是否无位置参数&#xff0c;如无参数&#xff0c;提示错误 3、编写函数实现两个数字做为参数&#xff0c;返回最…