stl之迭代器(iterator)

迭代器是一种抽象的设计概念,在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
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值