STL配接器
时间:2023-04-26 12:37:00
配接器
一.配接器概论
什么是配接器,按照正式定义,就是一个class接口转换为另一个class因为接口不兼容而无法合作的接口classes它可以一起工作。一般来说,转换接口以适应其他调用器,例如将两个参数转换为一个参数。
配接器补充定义:修改某一事物的界面成为另一个界面,以呈现不同的事物。
二.配接器分类
有function adapter(仿函数配接器),container adapter(容器配接器),iterator adapter(迭代器配接器)。
1.container adapter
STL中的queue和stack都是配接器,通过修改deque呈现另一个容器。
2.iterator adapter
STL可以获得一些迭代器配接器的接口。
注意:iterator adapter不像functor adapter直接以仿函数为参数,而容器为参数,间接以容器中的迭代器为参数。
Insert Iterator
所谓insert iterator,一般迭代器的赋值操作可以转换为插入操作。这样的迭代器有三个迭代器,专门负责尾端、头端和任何位置的插入,但这三个迭代器并不直观,所以用三个辅助函数连接这三个迭代器更容易使用。
Reverse Iterator
所谓reverse iterator逆转一般迭代器的行进方向,opertor 变成后退,operator–适用于从尾端开始的算法。
IOStream Iterator
所谓 iostream iterator将迭代器绑定到某个位置iostream从而使对象具有输入功能和输出功能。
3.functor adapters
functor adapters它是最大数量的配接器族群,因为它非常灵活,可以执行,如系统(bind),否定(negate),组合(compose),修改一般函数或成员函数使其成为仿函数等操作,可以灵活使用,使我们能够使用functor adapters做我们想要的事情很方便。
functor adapters这就是最大的价值:通过它们之间的组合、绑定、修饰能力创造出各种可能的表达式。
functor adapters一般函数和成员函数可以修饰,使接口变成仿函数STL这些函数可用于算法。
特别注意,所有希望获得配接能力的组件本身都应满足配接要求,即上一章中提到的相应类型。因此,仿函数本身必须继承这两类,成员函数必须通过mem_fun一般函数必须经过处理ptr_fun处理。
三.具体实现
1.container adapters
stack和queue都是作用于deque上面的配接器都闭了deque对外界面,只保留你想要使用的几个函数。
2.iterator adapters
以下是三种迭代器配接器的完整实现
insert iterator
主要实现的概念是:每个迭代器配接器都有一个相关的容器,使用重载和容器本身的功能将赋值操作转换为插入操作,注意迭代器配接器的外部性能或迭代器,但内部赋值操作转换为容器插入操作,如其他功能 ,–,*所有这些都被关闭返回配接器本身(这是有用的)。所以insert iterator它主要用于使用迭代器赋值,需要与容器绑定。
reverse iterator
这是一个非常神奇的配接器,与迭代器绑定,性能也像迭代器,主要功能是实现迭代器的反向移动,为了实现这个功能,首先需要左,以保持左右间隔,但也需要一些列移动操作重载,使方向逆转。许多容器本身也有rbegin和rend获得自己逆转配接器的函数功能。
stream iterator
所谓stream iterator与一个iostream绑定,表现为迭代器,主要功能是读入或读出。
首先说istream iterator,绑定其中一个istream,当迭代器 执行读入操作。在这种情况下,配接器中有两种初始化操作,一种是无参数的初始化。eos被初始化为false,这主要是用来判断另一个istream iterator没有读入结束(即 是否已经结束),另一个是参数的初始化,参数一般是cin,有参数后立即执行read然后阻塞,直到有数据输入(所以小心使用这个),直到遇到输入eof或者不同类别的数据,以及这个配接器 执行时间read,还有*返回读入时value。
然后说ostream iterator,其中也是绑定了一个ostream,当迭代器被赋值时(=)当输出操作被赋值时,首先输出赋值,然后输出初始化string,执行其他操作返回的是自己。
正如书中所说,这两种迭代器配接器向我们展示了如何定制迭代器配接器和更大的世界。
3.function adapters
所谓函数配接器,是指与函数绑定,如果该函数可以绑定(即有相应的获取类别),与上述相同,STL一些函数配接器已经被定义,如果要被这些函数配接器连接,相应的函数必须满足相应的类型,函数配接器最终表现为函数。
看下面的not。
接下来就介绍一些函数配接器。
not1,not2(逻辑否定返回值)
事实上,该配接器反映了函数配接器的整个过程:首先以某个函数为参数,然后在配接器内执行要执行的函数。当然,重载也应用于中间,使配接器本身表现得像仿函数。not没什么好说的,就是绑定一个自己回来bool值的可匹配函数,然后在函数重载中取回结果。
bind1st,bind2nd(绑定参数)
该配接器首先绑定一个函数,然后将第一个或第二个参数绑定到配接器中,然后在具体调用时只输入第二个或第一个参数。
compose1,compose(用于函数合成)
这也比较简单,传入两三个函数,然后根据规则组合。
ptr_fun(函数指针)
只要你对函数指针的定义略知一二,这也比较简单,ptr_fun其功能是将一般函数转化为仿函数,同时使配接后的函数也考验继续配接。
参考:stl中的ptr_fun的实现
mem_fun,mem_fun_ref(用于成员函数指针)
该功能是将成员函数转换为仿函数并继续连接。如果容器元素是指针或引用,也可以使用连接虚拟函数实现多态。
具体的实现也是在配接器中包装成员函数的指针,然后在重载函数中使用指针或引用该函数指针。我认为最不同的是将函数转换为模仿函数,然后使用该函数,而成员函数转换为模仿函数后,仍然需要在重载中调用一个类,当然,也可以有参数。几乎,事实上,仔细看或相对简单的答案。
四.小结
配接器是包装一件东西,然后显示另一件东西(有点绕哈哈),例如,包装容器显示插入迭代器,包装迭代器显示逆转迭代器,包装容器显示另一个容器,包装函数显示模仿函数。请注意,配接器最终不必显示为模仿函数,即不必使用()重载,也可以有其他使用方法。仔细阅读这一章并不难。
到目前为止,这本书是第一次读完,很少见,也许以后会再读一遍,然后再这些笔记。
路漫漫其修远兮,我将上下求索。道堵又长啊,下面就该看了《Linux高性能服务器编程,加油,今晚吃点好哈哈。