适配器详解

news/2024/11/18 2:39:39/

目录

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.ppmy.cn/news/46150.html

相关文章

spring redis Sentinel 哨兵 原理

客户端选择 redis 常用的连接客户端 有三个 Jedis&#xff1a;是老牌的Redis的Java实现客户端&#xff0c;提供了比较全面的Redis命令的支持&#xff0c;Redisson&#xff1a;实现了分布式和可扩展的Java数据结构。Lettuce&#xff1a;高级Redis客户端&#xff0c;用于线程安…

Socks5代理与HTTP代理:基本概念、工作原理和在网络应用中的应用

在互联网上&#xff0c;代理服务器是一种非常重要的技术手段&#xff0c;可以实现许多网络应用的高效和安全运行。Socks5代理和HTTP代理是两种常见的代理服务器类型&#xff0c;它们在网络应用中都有着重要的作用。本文将介绍Socks5代理和HTTP代理的基本概念、工作原理以及在网…

代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零

代码随想录算法训练营第四十三天|1049. 最后一块石头的重量 II 、494. 目标和 、474.一和零 1049. 最后一块石头的重量 II题目代码 494. 目标和题目代码 474.一和零题目代码 1049. 最后一块石头的重量 II 题目 1049. 最后一块石头的重量 II 有一堆石头&#xff0c;用整数数组…

程序员跳槽,要求涨薪50%过分吗?

如果问在TI行业涨工资最快的方式是什么&#xff1f; 回答最多的一定是&#xff1a;跳槽&#xff01; 前段时间&#xff0c;知乎上这样一条帖子引发了不少IT圈子的朋友的讨论 &#xff0c;有网友提问 “程序员跳槽要求涨薪50%过分吗&#xff1f;” 截图来源于知乎&#xff0c;…

做gl demo谨慎打开面剔除功能,否则容易干扰测试,没有错的情况下什么都不显示

关于何为面剔除&#xff0c;很多博主已经介绍得很清晰了&#xff0c;就不重复介绍了&#xff08;我懒&#xff09;&#xff1a; OpenGL基础32&#xff1a;面剔除_Jaihk662的博客-CSDN博客 其实面剔除对于有效减少渲染时看不到的面消耗的算力很有帮助&#xff0c;但在程序还没…

更深度了解getchar和putchar现象

目录 前言&#xff1a; 1.getchar和putchar 1.1基本使用 1.2一些特殊打印 1.3putchar打印空格 2.深度了解现象 前言&#xff1a; 经过学习&#xff0c;总结getchar()函数和putchar()函数在搭配使用while循环的时候&#xff0c;控制台窗口光标位置的出现位置的由来。 1.…

JavaScript【四】JavaScript中的函数

文章目录 &#x1f31f;前言&#x1f31f;什么是函数?&#x1f31f;函数声明方式&#x1f31f; function关键字&#x1f31f; 字面量定义(匿名函数)&#x1f31f; 实例化构造函数 &#x1f31f;函数调用方式&#x1f31f;通过括号调用&#x1f31f;自调用(IIFE)&#x1f31f;通…

基于matlab分析卫星星座对通信链路的干扰

一、前言 此示例说明如何分析从中地球轨道 &#xff08;MEO&#xff09; 中的卫星星座到位于太平洋的地面站的下行链路上的干扰。干扰星座由低地球轨道&#xff08;LEO&#xff09;的40颗卫星组成。此示例确定下行链路闭合的时间、载波噪声加干扰比以及链路裕量。 此示例需要卫…