stl之迭代器(iterator)

来源:互联网 发布:mysql获取当前时间错 编辑:程序博客网 时间:2024/05/20 09:11

迭代器是一种抽象的设计概念,在Gof的《design Patterns》书中提供了迭代器模式,定义如下:提供一种方法,使之能够依序遍历某个容器内的所有元素,但又无需暴露该聚合物的内部表述方式。

         在stl中,迭代器充当着容器(containers)和算法(algorithms)的粘合剂,所以了解迭代器十分重要。其源码实现对应于stl_iterator_base.h

         stl中提供了5种型别的迭代器,分别为:

         Inputiterators   只读

         Outputiterators  只写

         Forwarditerators  支持++,可读可写

         Bidirectionaliterators 支持++,支持--,可读可写

         Randomaccess iterators 支持+n,支持-n,可读可写

         从其支持的操作来看,Randomaccess iterator支持的操作最多,所以其适用的算法也越丰富。

         stl中算法都是与迭代器相关的,迭代器扮演者容器对象和算法交互的中间人关系,如对advance操作(作用是将一个迭代器向前推进n步),其具体实现如下:

template <calss InputIterator, classDistance>inline void advance(InputIterator& i,Distance n){         __advance(i,n, iterator_category(i));}

         函数中调用__advance,传入相应的迭代器类型,进而通过静态多态调用到了指定的__advance函数,__advance的实现版本有如下几个:

InputIterator版本:

template <class InputIterator, classDistance>inline void __advance(InputIterator& i,Distance n, input_iterator_tag){         while(n--)++I;}

Bidrectionalterator版本:

template <class Bidrectionalterator,class Distance>inline void __advance(BidrectionalIterator&i, Distance n, bidirectional_iterator_tag){         if(n>= 0)                   while(n--) ++i;         else                  while(n--) ++i;}

RandomAccessIterator版本:

template <class RandomAccessIterator,class Distance>inline void __advance(RandomAccessIterator&i, Distance n, random_access_iterator_tag){         i+= n;}

         这样,通过静态多态(重载)完美实现了迭代器与算法的衔接。

         至于如何萃取型别则是trait干的事了,这边不做说明,详情可以参考侯捷的《stl源码剖析》。

另外,对于流操作,stl提供了(下面这些迭代器实现在stl_iterator.h中):

         输出流迭代器ostream_iterator

         输入流迭代器istream_iterator

实例(作用是输出函数):

       int a[] = {1,2,3,4,5};       vector<int> v(a, a+5);       copy(v.begin(),v.end(), ostream_iterator<int>(cout,"\t"));

对于插入操作,stl提供了相应的插入迭代器,用于将值插入到容器中,它们也叫适配器作用是将容器转换为迭代器:

         insert_iterator普通插入迭代器  ,对应的插入操作使用insert

         front_insert_iterator将对象插入到数据集的前面,对应的插入操作使用push_front

         back_insert_iterator将对象插入到数据集的后面,对应的插入操作使用push_back

如:copy(vec.begin(), vec.end(), back_insert_iterator<list>(list)),其对应的源码片段为

back_insert_iterator<_Container>& operator=(const typename _Container::value_type& __value) {   container->push_back(__value);   return *this;  }

在使用copy的时候会用到赋值(=)操作,参考copy的部分实现源码如下:

template <class _InputIter, class_OutputIter, class _Distance>inline _OutputIter __copy(_InputIter__first, _InputIter __last,                          _OutputIter __result,                          input_iterator_tag,_Distance*){  for( ; __first != __last; ++__result, ++__first)   *__result = *__first; return __result;}

这些功能的目的是为了使容器能使用相关的算法功能。

参考:stl_algobase.h stl_iterator.h stl_iterator_base.h

1 0