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迭代器使用详解,很好很详细

写在前面,迭代器这种东西,就是为了使访问简单!! 容器::iterator iter; for(iter= 容器.begin();iter!=容易.end();iter++){ coutfirst等等...

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

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

STL 的 erase() 陷阱-迭代器失效总结

看到总结的不错,mark一下。 出处:http://blog.jobbole.com/109313/ 下面材料整理自Internet&著作。 TL中的容器按存储方式分为两...
  • Pillary
  • Pillary
  • 2016年12月25日 23:04
  • 242

STL中迭代器失效问题

1)vector erase造成迭代器失效  erase成员函数,它删除了迭代器指向的元素,并且返回要被删除的元素之后的迭代器。 #include #include using...
  • oniy_
  • oniy_
  • 2015年05月27日 15:54
  • 558

STL源码之迭代器

1、迭代器是什么?为什么要引入迭代器?   STL是将容器与算法分离开的,我们用到的类模板和函数模板即是用于实现这两个东西,其中类模板用于实现容器,函数模板用于实现算法,在使用的时候需要一个将两者...

STL的逆向迭代器

本文转自:http://zhouruijun163.blog.163.com/blog/static/10771562008111103635444/  在学习STL中关于迭代器reverse_...

泛型编程与STL学习笔记之迭代器

泛型编程与STL学习笔记之迭代器 什么是iterator? iterator是指针的概括物,它是用来指向其他对象的一种对象(它可不仅仅是指针哦,指针应该来说是迭代器的一种) 首先向大家阐明两...

双向循环链表——STL迭代器

“test.cpp” #define _CRT_SECURE_NO_WARNINGS 1 #include using namespace std; template struct ListNod...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:STL之迭代器
举报原因:
原因补充:

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