STL之迭代器

原创 2015年07月07日 19:14:33

1 迭代器的分类与特点

1)input_iterator                                     只读

2)output_iterator                                   只写 

3)forward_iterator                                  允许写入型算法在这种迭代器区间进行读写操作

4)bidirectional_iterator                           双向移动

5)random_access_iterator                      随机访问

template <class _Tp, class _Distance> struct input_iterator {
  typedef input_iterator_tag iterator_category;
  typedef _Tp                value_type;
  typedef _Distance          difference_type;
  typedef _Tp*               pointer;
  typedef _Tp&               reference;
};

struct output_iterator {
  typedef output_iterator_tag iterator_category;
  typedef void                value_type;
  typedef void                difference_type;
  typedef void                pointer;
  typedef void                reference;
};

template <class _Tp, class _Distance> struct forward_iterator {
  typedef forward_iterator_tag iterator_category;
  typedef _Tp                  value_type;
  typedef _Distance            difference_type;
  typedef _Tp*                 pointer;
  typedef _Tp&                 reference;
};


template <class _Tp, class _Distance> struct bidirectional_iterator {
  typedef bidirectional_iterator_tag iterator_category;
  typedef _Tp                        value_type;
  typedef _Distance                  difference_type;
  typedef _Tp*                       pointer;
  typedef _Tp&                       reference;
};

template <class _Tp, class _Distance> struct random_access_iterator {
  typedef random_access_iterator_tag iterator_category;
  typedef _Tp                        value_type;
  typedef _Distance                  difference_type;
  typedef _Tp*                       pointer;
  typedef _Tp&                       reference;
};


2 迭代器相应型别

template <class _Category, class _Tp, class _Distance = ptrdiff_t,
          class _Pointer = _Tp*, class _Reference = _Tp&>
struct iterator {
  typedef _Category  iterator_category;
  typedef _Tp        value_type;
  typedef _Distance  difference_type;
  typedef _Pointer   pointer;
  typedef _Reference reference;
};
iterator_category迭代器的类型标示,用于区分不同类别的迭代器,之所以将它定义为一种类类型,

是为了运用面向对象的重载机制来区分不同的迭代器.因为这仅为了标示.因此类别都定义为空类.

struct input_iterator_tag {};
struct output_iterator_tag {};
struct forward_iterator_tag : public input_iterator_tag {};
struct bidirectional_iterator_tag : public forward_iterator_tag {};
struct random_access_iterator_tag : public bidirectional_iterator_tag {};
它们之间的继承关系也一目了然.


3 迭代器类型提取  --- traits技术

3.1 traints技术:

1) 模板参数推导机制  

2) 偏特化技术    --- 解决以指针或常量指针实现的迭代器

template <class _Iterator>
struct iterator_traits {
  typedef typename _Iterator::iterator_category iterator_category;
  typedef typename _Iterator::value_type        value_type;
  typedef typename _Iterator::difference_type   difference_type;
  typedef typename _Iterator::pointer           pointer;
  typedef typename _Iterator::reference         reference;
};

template <class _Tp>
struct iterator_traits<_Tp*> {
  typedef random_access_iterator_tag iterator_category;
  typedef _Tp                         value_type;
  typedef ptrdiff_t                   difference_type;
  typedef _Tp*                        pointer;
  typedef _Tp&                        reference;
};

template <class _Tp>
struct iterator_traits<const _Tp*> {
  typedef random_access_iterator_tag iterator_category;
  typedef _Tp                         value_type;
  typedef ptrdiff_t                   difference_type;
  typedef const _Tp*                  pointer;
  typedef const _Tp&                  reference;
};

3.2 提取不同型别的实现

template <class _Iter>
inline typename iterator_traits<_Iter>::iterator_category
__iterator_category(const _Iter&)
{
  typedef typename iterator_traits<_Iter>::iterator_category _Category;
  return _Category();
}

template <class _Iter>
inline typename iterator_traits<_Iter>::difference_type*
__distance_type(const _Iter&)
{
  return static_cast<typename iterator_traits<_Iter>::difference_type*>(0);
}

template <class _Iter>
inline typename iterator_traits<_Iter>::value_type*
__value_type(const _Iter&)
{
  return static_cast<typename iterator_traits<_Iter>::value_type*>(0);
}

template <class _Iter>
inline typename iterator_traits<_Iter>::iterator_category
iterator_category(const _Iter& __i) { return __iterator_category(__i); }


template <class _Iter>
inline typename iterator_traits<_Iter>::difference_type*
distance_type(const _Iter& __i) { return __distance_type(__i); }

template <class _Iter>
inline typename iterator_traits<_Iter>::value_type*
value_type(const _Iter& __i) { return __value_type(__i); }

4 distance与advance

下面只是给出部分实现代码

4.1 distance

template <class _InputIterator, class _Distance>
inline void __distance(_InputIterator __first, _InputIterator __last,
                       _Distance& __n, input_iterator_tag)
{
  while (__first != __last) { ++__first; ++__n; }
}

template <class _RandomAccessIterator, class _Distance>
inline void __distance(_RandomAccessIterator __first, 
                       _RandomAccessIterator __last, 
                       _Distance& __n, random_access_iterator_tag)
{
  __n += __last - __first;
}

template <class _InputIterator, class _Distance>
inline void distance(_InputIterator __first, 
                     _InputIterator __last, _Distance& __n)
{
  __distance(__first, __last, __n, iterator_category(__first));
}


4.2 advance


template <class _InputIter, class _Distance>
inline void __advance(_InputIter& __i, _Distance __n, input_iterator_tag) {
  while (__n--) ++__i;
}

#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
#pragma set woff 1183
#endif

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;
}

#if defined(__sgi) && !defined(__GNUC__) && (_MIPS_SIM != _MIPS_SIM_ABI32)
#pragma reset woff 1183
#endif

template <class _RandomAccessIterator, class _Distance>
inline void __advance(_RandomAccessIterator& __i, _Distance __n, 
                      random_access_iterator_tag) {
  __i += __n;
}

template <class _InputIterator, class _Distance>
inline void advance(_InputIterator& __i, _Distance __n) {
  __advance(__i, __n, iterator_category(__i));
}




C++ STL 容器 迭代器 算法 [大三四八九月实习]

0 关于计算机语言中的命名 在计算机语言中,一个对象不管它被取为什么名字,只要知道它是用来干什么的即可。不必太纠结于它的名字,它没有行不改名坐不改姓的江湖气息,自己如果觉得有一个更适合的名字可以在自己...
  • misskissC
  • misskissC
  • 2013年08月19日 10:54
  • 3101

C++ STL 容器、迭代器、适配器

1、容器vector,list,deuqe是C++STL中三种基本容器实现,它们不可能互为实现同时又不损失效率 2、stack和queue则都可以在这三种基本容器序列基础上实现,所以没有定义为独立...
  • richrdbird
  • richrdbird
  • 2016年03月31日 15:36
  • 1746

关于STL中map的erase迭代器是否失效的讨论

近来,在阅读一份开源代码的时候,看到了类似如下的代码:typedef std::map id_names_t; id_names_t id_names; void EraseName(std::st...
  • haust_wang
  • haust_wang
  • 2015年10月21日 10:16
  • 2070

c++语言STL - 迭代器部分讲解(大连理工资深教授)

  • 2010年08月12日 20:05
  • 376KB
  • 下载

C++ STL迭代器机制剖析.pdf

  • 2008年11月02日 09:40
  • 173KB
  • 下载

面向对象方法(STL_analysis)of_Iterator迭代器

  • 2012年09月07日 08:49
  • 236KB
  • 下载

【C++】:STL迭代器使用详解,很好很详细

写在前面,迭代器这种东西,就是为了使访问简单!! 容器::iterator iter; for(iter= 容器.begin();iter!=容易.end();iter++){ coutfirst等等...
  • qq_23100787
  • qq_23100787
  • 2016年05月12日 22:28
  • 7171

STL 容器和迭代器连载7_容器大小的操作

001 /*- ========================================================== 002 * ...
  • Plutus_Lee
  • Plutus_Lee
  • 2012年09月17日 15:52
  • 386

STL与泛型编程<九>:迭代器相关辅助函数

STL为迭代器提供了三个辅助函数:advance(),distance()和iter_swap()。前二者提供给所有迭代器一些原本只有随机迭代器才有的能力:前进或后退多个元素,及处理迭代器之间的距离。...
  • MonroeD
  • MonroeD
  • 2016年03月27日 17:28
  • 336

【STL源码剖析读书笔记】【第3章】迭代器概念与traits编程技法

1、迭代器模式:提供一种方法,使之能够依序寻访某个容器所含的各个元素,而又无需暴露该聚合物的内部表达式。 2、STL的中心思想:将数据容器和算法分开,彼此独立设计,最后用迭代器将它们撮合在一起。 3、...
  • ruan875417
  • ruan875417
  • 2015年05月05日 09:47
  • 456
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL之迭代器
举报原因:
原因补充:

(最多只允许输入30个字)