STL源码剖析 笔记之八 配接器

来源:互联网 发布:cloudtv mac 编辑:程序博客网 时间:2024/06/11 15:50
第八章 配接器
配接器在STL组件的灵活组合运用上,扮演着轴承、转换器的角色。
设计模式中对配接器的定义如下:将一个class的接口转换为另一个class的接口,使其因接口不兼容而不能合作的classes,可以一起运作。
1.container adapter 改变容器接口的配接器
STL提供的queue和stack这两个容器,其实属于配接器,它们修饰deque的接口而成就另一种容器风貌。
①stack
stack的底层由deque构成。class stack封住了所有的deque对外接口,只开房符合stack原则的几个函数。
所以我们说stack是一个作用于容器之上的配接器。
②queue
queue的底层由deque构成。class queue封住了所有的deque对外接口,只开房符合queue原则的几个函数。
所以我们说queue是一个作用于容器之上的配接器。
2.iterators adapter
STL提供了许多应用于迭代器身上的配接器,包括insert iterators,reverse iterators,iostream iterators。
C++标准规定它们的接口可以由<iterator>获得,SGI STL将它们定义于<stl_iterator.h>。
①insert iterators
  可以将一般迭代器的赋值(assign)操作转变为插入(insert)操作。
包括back_insert_iterator,front_insert_iterator,insert_iterator。
主要观念是,每个insert iterators内部都维护有一个容器:容器当然有自己的迭代器,
于是客户端对insert iterators做赋值操作时,就在insert iterators中转为对该容器的迭代器做插入操作,
其他的迭代器功能则被关闭。
back_insert_iterator、front_insert_iterator、inser_iterator
reverse iterators
  可以将一般迭代器的行进方向逆转。这种倒转的性质运用在从尾部开始的算法上,有很大的方便性。
  当迭代器被逆转,虽然实体位置不变,但逻辑位置必须改变,是为了配合迭代器区间的前闭后开规则。
  template <class Iterator>
class reverse_iterator 
{
protected:
  Iterator current;//逆向迭代器内部保留其对应的正向迭代器
...
}
③iostream iterators
  可以将迭代器绑定到某个iostream对象身上。
  所谓绑定一个istream object,其实就是在istream iterator内部维护一个istream member,
客户端对这个迭代器做的++操作,会被导引调用内部所含的那个istream member的输入操作。
  只要客户端定义一个istream iterator并绑定到某个istream object,程序便立刻停在istream_iterator<T>::read()(在构造中调用),等待输入。
  所谓绑定一个ostream object,就是在ostream iterator内部维护一个ostream member,
客户端对这个迭代器做的=操作,会被导引调用内部所含的那个ostream member的输出操作。
这里介绍的迭代器配接器很少以迭代器为直接参数,通常它们以容器为直接参数。
3.function adapter 
仿函数配接器是所有配接器中数量最庞大的一个族群,配接灵活度很高,可以配接配接再配接。
这些配接操作包括绑定(bind)、否定(negate)、组合(compose)、以及对一般函数或成员函数的修饰。
仿函数配接器的价值在于,通过它们之间的绑定、组合、修饰能力,几乎可以创造出各种可能的表达式,配合STL算法。
所有期望获得配接能力的组件,本身都必须是可配接的。一元仿函数必须继承自unary_function,二元仿函数必须继承自binary_function,
成员函数必须以mem_fun处理过,一般函数必须以ptr_fun处理过。
总结:
配置器是一个实现了动态空间配置、空间管理、空间释放的class template。
容器是以class templates完成
算法以function templates完成
仿函数是重载operator()的class templates
迭代器是重载operator++、operator*、operator->等指针操作的class templates
配接器同样也是一种class templates:
    contrainer adapters内藏一个contrainer member
    insert iterator(adapters)内藏一个pointer to contrainer(并据此取得其iterator) 
    reverse iterator(adapters)内藏一个iterator member 
    stream iterator(adapters) 内藏一个pointer to stream 
    function adapters内藏adaptable functor member object或者函数指针
①对返回值进行否定 not1 not2
  内部成员为一元、二元仿函数
②对参数进行绑定 bind1st bind2st
  将仿函数和第一或第二个参数记录于配接器内部成员
③用于函数合成 compose1 compose2  非STL标准
  一元仿函数 内部记录两个仿函数成员
  二元仿函数 内部记录三个仿函数成员 针对每个参数有一个修饰的仿函数对象
④用于函数指针 ptr_fun
  内部记录一个函数指针成员//Result (*ptr)(Arg); //Result (*ptr)(Arg1, Arg2);
⑤用于成员函数指针 mem_fun mem_fun_ref
  内部记录一个成员函数指针 // S (T::*f)();
  当容器的元素形式是X&或者X*,而我们又以虚成员函数作为仿函数,
便可以藉由泛型算法完成所谓的多态调用,这是泛型与多态的重要接轨。

仿函数配接器的实际应用中,通常使用辅助函数,而不自行产生对象。
原创粉丝点击