STL的iterator

  1 #include <cstddef>
  2 
  3 struct input_iterator_tag {};
  4 struct output_iterator_tag {};
  5 struct forward_iterator_tag : public input_iterator_tag {};
  6 struct bidirectional_iterator_tag : public forward_iterator_tag {};
  7 struct random_access_iterator_tag : public bidirectional_iterator_tag {};
  8 
  9 template<typename Category, typename T, typename Distance = ptrdiff_t,
 10          typename Pointer = T*, typename Reference = T&>
 11 struct iterator
 12 {
 13     typedef Category    iterator_category;
 14     typedef T           value_type;
 15     typedef Distance    difference_type;
 16     typedef Pointer     pointer;
 17     typedef Reference   reference;
 18 };
 19 
 20 // traits
 21 template<typename Iterator>
 22 struct iterator_traits
 23 {
 24     typedef typename Iterator::iterator_category    iterator_category;
 25     typedef typename Iterator::value_type           value_type;
 26     typedef typename Iterator::difference_type      difference_type;
 27     typedef typename Iterator::pointer              pointer;
 28     typedef typename Iterator::reference            reference;
 29 };
 30 
 31 // 针对原生指针(native pointer)而设计的traits偏特化版
 32 template<typename T>
 33 struct iterator_traits<T*>
 34 {
 35     typedef random_access_iterator_tag  iterator_category;
 36     typedef T                           value_type;
 37     typedef ptrdiff_t                   difference_type;
 38     typedef T*                          pointer;
 39     typedef T&                          reference;
 40 };
 41 
 42 // 针对原生之 pointer-to-const 而设计的 traits 偏特化版
 43 template<typename T>
 44 struct iterator_traits<const T*>
 45 {
 46     typedef random_access_iterator_tag  iterator_category;
 47     typedef T                           value_type;
 48     typedef ptrdiff_t                   difference_type;
 49     typedef const T*                    pointer;
 50     typedef const T&                    reference;
 51 };
 52 
 53 // 判定某个迭代器的类型(Category)
 54 template<typename Iterator>
 55 inline typename iterator_traits<Iterator>::iterator_category 
 56 iterator_category(const Iterator&)
 57 {
 58     typedef typename iterator_traits<Iterator>::iterator_category 
 59         category;
 60     return category();
 61 }
 62 
 63 // 判定某个迭代器的 distance type
 64 template<typename Iterator>
 65 inline typename iterator_traits<Iterator>::difference_type*
 66 distance_type(const Iterator&)
 67 {
 68     return static_cast<typename iterator_traits<Iterator>::difference_type*>(0);
 69 }
 70 
 71 // 判定某个迭代器的 value type
 72 template<typename Iterator>
 73 inline typename iterator_traits<Iterator>::value_type*
 74 value_type(const Iterator&)
 75 {
 76     return static_cast<typename iterator_traits<Iterator>::value_type*>(0);
 77 }
 78 
 79 
 80 // 以下是整组的 distance 函数
 81 template<typename InputIterator>
 82 inline typename iterator_traits<InputIterator>::difference_type
 83 __distance(InputIterator first, InputIterator last, input_iterator_tag)
 84 {
 85     typename iterator_traits<InputIterator>::difference_type n = 0;
 86     while(first != last)
 87     {
 88         first++;
 89         n++;
 90     }
 91     return n;
 92 }
 93 
 94 
 95 template<typename RandomAccessIterator>
 96 inline typename iterator_traits<RandomAccessIterator>::difference_type
 97 __distance(RandomAccessIterator first, RandomAccessIterator last,
 98         random_access_iterator_tag)
 99 {
100     return last - first;
101 }
102 
103 template<typename InputIterator>
104 inline typename iterator_traits<InputIterator>::difference_type
105 distance(InputIterator first, InputIterator last)
106 {
107     typedef typename iterator_traits<InputIterator>::iterator_category
108         category;
109     return __distance(first, last, category());
110 }
111 
112 // 以下是整组的 advance 函数
113 template<typename InputIterator, typename Distance>
114 inline void __advance(InputIterator& i, Distance n, input_iterator_tag)
115 {
116     while(n--)
117         i++;
118 }
119 
120 template<typename BidirectionalIterator, typename Distance>
121 inline void __advance(BidirectionalIterator& i, Distance n, 
122         bidirectional_iterator_tag)
123 {
124     if(n >= 0)
125         while(n--) i++;
126     else
127         while(n++) i--;
128 }
129 
130 template<typename RandomAccessIterator, typename Distance>
131 inline void __advance(RandomAccessIterator& i, Distance n,
132         random_access_iterator_tag)
133 {
134     i += n;
135 }
136 
137 template<typename InputIterator, typename Distance>
138 inline void advance(InputIterator& i, Distance n)
139 {
140     __advance(i, n, iterator_category(i));
141 }

猜你喜欢

转载自www.cnblogs.com/cccv/p/stl_004.html