SGI-STL简记(十一)-适配器(容器、迭代器、仿函数)

适配器(adapters):

    概念上类似于设计模式中的适配,此处STL中的适配器可对组件的组合、灵活运用扮演重要角色。
    STL中适配器主要有:容器适配器、迭代器适配器、仿函数适配器
    
容器适配器:
    
    queue(先进先出)、stack(先进后出)、priority_queue(优先队列)适配器,即queue和stack的_Sequence序列模板参数默认类型为deque<T>(双端队列),
   priority_queue底层则为vector,当然也可以是其他满足适配器的必要接口的容器也可,如:
    用list、vector、deque实现stack,用list、deque实现queue(vector没有提供pop_front),用deque、vector实现priority_queue(list没有提供随机访问迭代器)
   故这几个可认为是序列模板容器_Sequence的包装器。
   此外,这些容器适配器没有提供可随机走访的接口,也没有提供相应的迭代器。
   priority_queue利用max-heap最大堆处理并默认以vector来存储(以完全二叉树形式的堆)(内部使用heap_heap和heap_pop实现堆算法)。 迭代器适配器: insert iterator 插入迭代器(通过重载operator
=,即赋值的方式来插入元素),主要有以下几个包装迭代器: back_insert_iterator(调用容器的push_back插入); front_insert_iterator(调用容器的push_front插入); insert_iterator(调用容器的insert在指定迭代器位置后插入); 对应生成以上三种迭代器的便利函数:back_inserter、front_insert、inserter; reverse iterator 逆转迭代器(即将原本operator++变为后退操作,operator--变为前进操作) reverse_iterator逆转迭代器类,提供了基本的逆转迭代操作(内部引用包含了一个iterator迭代器,即可认为逆转迭代器包装了容器迭代器); 此外部分容器的rbegin()、rend()可分别返回含尾部迭代器、首部迭代器位置的逆转迭代器。 iostream iterator IO流迭代器(绑定iostream对象到迭代器上,操作迭代器时可方便地操作数据流对象) 本质上,IO流迭代器内部维护一个stream流对象,当对迭代器对象执行输入或输出操作时,即转接调用到stream流对象上的操作。 istream_iterator包装istream对象;ostream_iterator包装ostream对象。 仿函数适配器: 可以实现无限次适配(包装)(也即可用仿函数包装仿函数),通过绑定、组合和修饰,可以实现各种复杂的表达式。 此外,一个可适配的对象,应是可适配的,也即是一元仿函数需继承unary_function、二元仿函数需继承自binary_function, 而对成员函数则应以mem_fun包装处理,一般函数应以ptr_fun包装处理。也就是说,若是可适配的,则可实现无限包装。 常见的仿函数适配器: bind1st、bind2nd、not1、not2、compose1、compose2、ptr_fun、mem_fun、mem_fun_ref、mem_fun1、mem_fun1_ref等。
原文地址:https://www.cnblogs.com/haomiao/p/11666283.html