STL源码剖析 8、配接器
概念
将一个class的接口转换为另一个class的接口,使原本因接口不兼容而不能合作的classes,可以一起运作
分类
●仿函数配接器:数量最多,有bind、negate、compose等。
本身要可配接才能获得配接能力,一元函数继承自unary_function、二元…、成员函数以mem_fun处理、一般函数以ptr_fun处理(成员函数和一般函数没有operator())
●容器配接器:stack和queue内部是deque实现
●迭代器配接器:insert iterators,reverse iterators,iostream iterators
规律
容器配接器类内含一个容器成员。
reverse iterator配接器类内含一个迭代器(正序)。
insert iterator配接器内含容器指针(方便插入)。
stream iterator 迭代器内含stream指针。
仿函数配接器内含一个可配接的仿函数的对象Operation op;
容器配接器
stack和queue
template<class T, class Sequence = deque<T>>
class stack{ //queue就是把stack改成queue
protected: Sequence c; //底层容器
>>>
}
迭代器配接器
insert iterators
●编写
1、内部维护容器Container *container;
2、“operator =”变成插入
back_insert_iterator<Container>&
operator=(const typename Container::value_type& value){
container->push_back(value);
return *this;
}
3、*、前置/后置++不起作用(没有意义),即函数体内只有一句return *this;
4、辅助函数
template<class Container>
inline back_insert_iterator<Container>back_inserter(Container& x){
return back_insert_iterator<Container>(x);
}
●应用
int ia[] = {0, 1, 2, 3, 4, 5};
deque<int>id(ia, ia + 6);
//将copy中的=操作变为push_back,front则变为push_front
copy(ia + 1, ia + 2, back_inserter(id));
reverse iterators
●应用
//vector和list中
reverse_iterator rbegin() {return reverse_iterator(end());}
reverse_iterator rend() {return reverse_iterator(begin());}
●注意:
●编写
1.类内部维护对应的正向迭代器Iterator current;
2.逆向迭代器的相应型别和对应的正向迭代器相同
typedef typename Iterator_traits<Iterator>::iterator_categoty iterator_categoty;
...
3.重载operator*,对逆向取值就是将正向后退一格取值
reference operator*() const{
Iterator tmp = current;
return *--tmp; //关键
}
4.逆转+和-,+=和-=, ++和–
self& operator++(){
--current;
return *this;
}
...
stream iterators见书8.3.3
仿函数配接器
predicate是谓词的意思
仿函数配接器表格见8.4
bind1st和bind2nd:将二元函数转换为一元函数
●使用:
not1(一元),not2(二元):对返回值进行逻辑否定
●使用:不小于12的元素个数:not1(bind2nd(less<int>(), 12))
●代码:
compose1,compose2:用于函数合成
●使用:数学表达式f(g(elem))写成compose1(f(x), g(y));
●代码:
ptr_fun:用于函数指针,将一般函数(无配接能力)当成仿函数传给STL算法,使其获得配接能力
●代码:
mem_fun,mem_fun_ref:用于成员函数指针
●使用:
上一篇: STL源码——仿函数
下一篇: STL源码剖析——红黑树RB-tree