C++标准库分析总结(十一)——<适配器>

news2025/1/21 13:05:26

目录

1 适配器简介

2 适配器使用分类

2.1 容器适配器

2.2 函数适配器

2.2.1 常见的函数适配器

2.2.2 bind2nd

2.2.3 not1

2.2.4 新型适配器bind

2.3 迭代器适配器

2.3.1 reverse_iterator

2.3.2 insert_iterator

2.4 X适配器

2.4.1 ostream_iterator

2.4.2 istream_iterator





1 适配器简介

        把一个原本存在的东西,改成我们需要的另一种东西(把类中的函数名称改一下,接口改一改(三个参数变两个参数)),比如stack就是deque的适配器,反向迭代器也是从迭代器上改造过来的,比如a是b的适配器,对于外部来说当然我们就用a就好了,b对于我们来说就是隐藏的,但是a它只起中间桥梁作用,活还是交给b来做(b是已经存在的好东西)。

适配器在STL组件的灵活组合运用功能上,扮演着轴承、转换器的角色

适配器的实现方式有两种:继承和内含,STL普遍使用内含的方式。

适配器分为三类迭代器适配器,容器适配器,仿函数适配器

  • 1)改变仿函数接口者,称为函数适配器;对于函数适配器,适配器他也需要获得对应的仿函数一些信息
  • 2)改变容器接口者,称为容器适配器
  • 3)改变迭代器接口者,称为迭代器适配器

2 适配器使用分类

适配器分为三类:

  • 迭代器适配器
  • 容器适配器
  • 仿函数适配器

2.1 容器适配器

STL提供两个容器适配器:queuestack,它们修饰deque的接口而生成新的容器风貌stack的底层由deque构成

  • stack封锁住了所有的deque对外接口,只开放符合stack原则的几个函数
  • queue的底层也由deque构成。queue封锁住了所有的deque对外接口,只开放符合queue原则的几个函数

 

2.2 函数适配器

2.2.1 常见的函数适配器

在这里插入图片描述

2.2.2 bind2nd

从bind2nd这个函数,我们可以看到函数适配器的一些巧妙之处。
对于模板,我们知道:

  • 1.对于类模板,它必须指明类中元素的类型,而不能由类自己推导
  • 2.对于函数模板,它有能力自己推导传入的参数类型。
vector<int> vec;    //这个int表明我们必须声明类中元素类型
max(1,2);           //即使我们不声明参数1和2的类型,函数max也可以为我们自动推导出他们的类型。

2.2.3 not1

std::not1 是用来把符合某种特殊条件的『函数对象』转换为反义「函数对象」的函数。

2.2.4 新型适配器bind

(1)所有bind相关的在c++11都用bind取代了,如图

(2)bind可以绑定函数、函数对象、成员函数、数据成员。

2.3 迭代器适配器

2.3.1 reverse_iterator

  • 可以通过一个双向顺序容器调用rbegin(),和rend()来获取相应的逆向迭代器。只要双向顺序容器提供了begin(),end(),它的rbegin()和rend()就如同下面的形式。
  • 单向顺序容器slist不可使用reserve iterators。有些容器如stack、queue、priority_queue并不提供begin(),end(),当然也就没有rbegin()和rend()。

2.3.2 insert_iterator

  • insert iterators:可以将一般迭代的赋值操作转变为插入操作,可以分为下面几个
  • insert iterators实现的主要观念是:每一个insert iterators内部都维护有一个容器(必须由用户指定);容器当然有自己的迭代器,于是,当客户端对insert iterators做赋值操作时,就在insert iterators中被转为对该容器的迭代器做插入操作(也就是说,调用底层容器的push_front()或push_back()或insert())
insert iterator作用
back_insert_iterator专门负责尾端的插入操作
front_insert_iterator专门负责首部的插入操作
insert_iterator可以从任意位置执行插入操作

2.4 X适配器

前面总结的适配器有三大类(函数适配器,容器适配器,迭代器适配器),istream_iteratorostream_iterator均不属于前面提到的三大类别,所以称为X适配器

2.4.1 ostream_iterator

2.4.2 istream_iterator

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

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

相关文章

BUUCTF-babyheap_0ctf_2017

checksec 标准堆菜单 IDA Allocate void __fastcall sub_D48(__int64 a1) {int i; // [rsp10h] [rbp-10h]int v2; // [rsp14h] [rbp-Ch]void *v3; // [rsp18h] [rbp-8h]for ( i 0; i < 15; i ){if ( !*(_DWORD *)(24LL * i a1) ){printf("Size: ");v2 sub_1…

【云原生】无VIP稳定性和可扩展性更强的k8s高可用方案讲解与实战操作

文章目录一、概述二、架构三、开始部署1&#xff09;节点信息2&#xff09;前期准备&#xff08;所有节点&#xff09;1、配置hosts2、配置互信3、时间同步4、关闭防火墙5、禁用SELinux6、关闭swap7、设置bridge-nf-call-iptables3&#xff09;安装容器docker&#xff08;所有节…

C++标准库分析总结(十)——<仿函数/函数对象>

目录 1.functor仿函数简介 2 仿函数的分类 3 仿函数使用 4 仿函数可适配的条件 1.functor仿函数简介 仿函数是STL中最简单的部分&#xff0c;存在的本质就是为STL算法部分服务的&#xff0c;一般不单独使用。仿函数&#xff08;functors&#xff09;又称为函数对象&…

Windows 命令行cmd.exe简单介绍

介绍&#xff1a; 在windows系统中&#xff0c;Windows命令shell&#xff08;cmd.exe&#xff09;,在 SystemRoot/System32目录下。 启动命令行&#xff0c;在"开始"——>"搜索"中输入cmd&#xff0c;此时命令行展示当前工作目录&#xff0c;默认为/u…

JS(第二十四课)JS高级Es6语法

ECMAScript 6_百度百科 (baidu.com) 第一部分:百度简介 ECMAScript 6&#xff08;简称ES6&#xff09;是于2015年6月正式发布的JavaScript语言的标准&#xff0c;正式名为ECMAScript 2015&#xff08;ES2015&#xff09;。它的目标是使得JavaScript语言可以用来编写复杂的大型…

mybatis 01: 静态代理 + jdk动态代理 + cglib动态代理

背景 有时目标对象不可直接访问&#xff0c;只能通过代理对象访问 图示&#xff1a; 示例1&#xff1a; 房东 > 目标对象房屋中介 > 代理对象你&#xff0c;我 > 客户端对象示例2&#xff1a; 运营商(电信&#xff0c;移动&#xff0c;联通) > 目标对象第三方公司…

(Java)P1223 排队接水

排队接水 一、 题目描述 有 nnn 个人在一个水龙头前排队接水&#xff0c;假如每个人接水的时间为 TiT_iTi​&#xff0c;请编程找出这 nnn 个人排队的一种顺序&#xff0c;使得 nnn 个人的平均等待时间最小。 二、输入格式 第一行为一个整数 nnn。 第二行 nnn 个整数&…

Linux下加密库Libsodium 使用实践(ip监听、封装的加密消息、运行系统命令)

Libsodium 是一个用C语言编写的库&#xff0c;是一种新的易于使用的高速软件库&#xff0c;用于网络通信、加密、解密、签名等实现和简化密码学。 完成 Libsodium 安装 Libsodium 是一个用于加密&#xff0c;解密&#xff0c;数字签名&#xff0c;密码哈希&#xff0c;等的&a…

java每日一练(4)

java每日一练(4) 文章目录单选部分不定项选择题多选题编程题单选部分 1.下列与队列结构有关联的是&#xff08;&#xff09; A 函数的递归调用   B 数组元素的引用   C 多重循环的执行   D 先到先服务的作业调度 队列的特点 &#xff1a; 先进先出 , 所以 答案非常明显 D  …

【python】通过gitlab v4版本api接口获取所有项目代码示例

目录一、环境信息二、参数说明三、脚本使用说明1. 使用python2运行git.py2. python脚本执行完毕会自动生成如下四个文件3. 其他脚本说明四、脚本源码1. git.py2. update.sh五、脚本扩展说明附录一、环境信息 脚本适用于&#xff1a;python2 测试版本&#xff1a;2.7.18 二、…

于我来说,赌才是世界杯的灵魂~

大家好&#xff0c;我是雄雄&#xff0c;欢迎关注微信公众号&#xff1a;雄雄的小课堂。 先看这里前言了解足球首看世界杯再看世界杯前言 身边朋友也有踢球的&#xff0c;但是不多。就两个&#xff0c;一个是我同学&#xff0c;一个是我同事…打篮球的倒是不少&#xff0c;猜想…

这五个适合上班族的副业你知道多少

第二职业赚钱的路子有什么&#xff1f;从理论上讲&#xff0c;第二职业就是一个创业的过程&#xff0c;也遵照自主创业一般规律。可是第二职业是在业余时间和没有灵活运用资源挣钱&#xff0c;和创业有所不同。第二职业门坎变低&#xff0c;更比较发达&#xff0c;因此今天小编…

Arduino--音乐频谱

本文主要介绍基于Arduino实现的音乐频谱显示&#xff0c;音乐频谱原理就是声音传感器&#xff08;MIC&#xff09;接收音频信号后通过FFT将时域信号转换成频域信号&#xff0c;再将音频信号频域分量分别显示在对应的LED点阵屏上&#xff0c;呈现出音乐随频律动的感觉&#xff0…

Windows Docker Desktop安装K8S

Docker DeskTop提供了K8S支撑&#xff0c;安装也较为简单。对于本地开发&#xff0c;测试部署项目较为方便。下面进行简单说明。 DockerDesktop配置镜像源&#xff0c;较为简单&#xff0c;有许多网上例子直接参考即可。启用K8S等待一阵子&#xff0c;K8S即可安装成功。可以看…

MySQL存储引擎介绍

首先 我们要知道 什么是引擎 我们常见的 客机 直升机 火箭等等 他们都有自己的引擎 引擎也就是指一个机器的核心 当然 你如果是一个飞机 那你自然是不能用火箭的引擎的 存储引擎就是存储数据 建立索引 更新/查询数据等技术的实现方式&#xff0c;存储引擎是基于表的&#xf…

TDK | CeraLink 电容器快速切换逆变器的革新

本周向大家介绍另一款压电技术的产品CeraLink。 CeraLink 是一系列非常紧凑的电容器&#xff0c;用于稳定直流链路中的电压。因此它们适合用作缓冲器或直流母线电容器。这些产品基于 PLZT 陶瓷&#xff0c;旨在为工程师提供针对快速开关转换器、空间要求非常紧凑的转换器和需要…

Java项目:饰品商城系统(java+SSM+JSP+javascript+jQuery+Mysql)

源码获取&#xff1a;俺的博客首页 "资源" 里下载&#xff01; 项目介绍 本项目分为前台与后台&#xff0c;有普通用户与管理员两种角色&#xff1b; 管理员角色包含以下功能&#xff1a; 管理员登录,用户管理,一级分类管理,二级分类管理,饰品管理,订单管理、发货、…

Linux中对磁盘(硬盘)分区和挂载

记录&#xff1a;346 场景&#xff1a;在CentOS 7.9操作系统上&#xff0c;使用fdisk对磁盘分区&#xff1b;使用mkfs.xfs创建文件系统&#xff1b;使用mount挂载磁盘到目录&#xff1b;使用umount卸载目录已挂载的磁盘&#xff1b;修改文件系统表fstab&#xff0c;满足开机启…

【计算机毕业设计】网上游戏代练商城系统

一、系统截图&#xff08;需要演示视频可以私聊&#xff09; 摘要 随着当今社会的发展&#xff0c;时代的进步&#xff0c;各行各业也在发生着变化&#xff0c;本系统健身房这一方面&#xff0c;利用网站游戏代练已经逐步进入人们的生活。传统的网上游戏代练&#xff0c;都是用…

前端基础入门

HTML的基本概念 WWW&#xff08;World Wide Web&#xff0c;万维网&#xff09;是一种建立在Internrt上的、全球性的、交互的、多平台的、分布式的信息资源网络。它采用HTML语言描述超文本&#xff08;Hypertext&#xff09;文件。这里所说的超文本文件指的是包含链接关系和多…