标签:
花了两天时间略读了一下《stl源码分析》,看了个大体,对于细节并没有深究。之所以想翻翻这本书,主要是想看看stl中的特性、适配器的具体实现。看完之后收获还是蛮大的,模板的各种组合让我眼前一亮,下面大概总结一些内容。
template<class InputIterator, class Distance> inline void __advance(InputIterator& i, Distance n, input_iterator_tag){ whie(n--) ++i; } template<class ForwardIterator, class Distance> inline void __advance(ForwardIterato& i, Distance n, fowrd_iterator_tag){ __advance(i,n,input_iterator_tag()); } template<class BidirectionalIterator, class Distance> inline void __advance(BidirectionalIterator& i, Distance n, bidirectional_iterator_tag){ if(n >= 0){ while(n--) ++i; }else{ while(n++) --i; } } template<class RandomAccessIterator, class Distance > linue void __advance(RandomAccessIterator& i, Distance n, random_access_iterator_tag){ i += n; }
实现了四个不同的函数重载,再增加一个上层函数advance(),粹取出迭代器的类型,并调用相应的__advance版本。
template<class InputIterator, class Distance> inline void advance(InputIterator& i, Distance n){ __advance(i,n,iterator_traits<InputIterator>::iterator_category()); }
5.适配器:适配器的实现主要是在内部包含了一个对象,在外面展示不同的接口,内部实际上还是间接使用了其所包含的对象。为什么说为了让一个函数对象在stl是可适配的?因为在外层类中要使用到内部包含类型的某些”特性“,比如bind1st,就要使用到内部二元函数仿函数的first_argument_type。所以为了能够被适配,一般都要继承unary_function和binary_function。
template<class Operation> class binder1st : public unary_function<typename Operation::second_argument_type, typename Operation::result_type>{ protected: Operation op; typename Operation::first_argument_type value; public: binder1st(const Operation& x, const typename Operation::first_argument_type& y):op(x),value(y){} typename Operation::result_type operator()(const typename Operation::second_argument_type& x)const{ return op(value,x); } }; template<class Operation, class T> inline binder1st<Operation> bind1st(const Operation& op, const T& x){ typedef typename Operation::first_argument_type arg1_type; return binder1st<Operation>(op,arg1_type(x)); }
嗯,就先总结到这些吧。其他的一些东西要么之前了解得比较熟了,那么印象不是很深刻,就不写出来了。
标签:
原文地址:http://www.cnblogs.com/yplhh/p/4631192.html