-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathiterator.h
157 lines (138 loc) · 4.24 KB
/
iterator.h
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
#ifndef ITERATOR_H_INCLUDED
#define ITERATOR_H_INCLUDED
#include <cstddef>
namespace marrySTL
{
//五种迭代器类型
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{};//涵盖原生态指针能力
//迭代器模板
template <class Category,class T,class Distance=ptr,class Point=T*,class Reference=T&>
struct iterator
{
typedef T value_type;
typedef Distance difference_type;
typedef Point pointer;
typedef Reference reference;
typedef Category iterator_category;
};
template<class Iterator>
struct iterator_traits
{
typedef typename Iterator::iterator_category iterator_category;
typedef typename Iterator::reference reference;
typedef typename Iterator::pointer pointer;
typedef typename Iterator::difference_type difference_type;
typedef typename Iterator::value_type;
};
//指针特化
template<class T>
struct iterator_traits<T*>
{
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
typedef random_access_iterator_tag iterator_category;
};
//常量指针特化
template<class T>
struct iterator_traits<const T*>
{
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
typedef random_access_iterator_tag iterator_category;
};
//获取迭代器类型
template<class Iterator>
typename iterator_traits<Iterator>::iterator_category
iterator_category(const Iterator&)
{
typedef typename iterator_traits<Iterator>::iterator_category category;
return category();
}
// 获取迭代器差值类型 distance type
template <class Iterator>
inline typename iterator_traits<Iterator>::difference_type*
distance_type(const Iterator&)
{
return static_cast<typename iterator_traits<Iterator>::difference_type*>(0);
}
// 获取迭代器值类型 value_type
template <class Iterator>
inline typename iterator_traits<Iterator>::value_type*
distance_type(const Iterator&)
{
return static_cast<typename iterator_traits<Iterator>::value_type*>(0);
}
//advance实现
//原生态指针特化
template <class InputIterator,class Distance>
void __advance(InputIterator& it,Distance n, random_access_iterator_tag)
{
it=it+n;
}
//双向操作指针特化
template <class InputIterator,class Distance>
void __advance(InputIterator& it,Distance n, bidirectional_iterator_tag)
{
if(n>0)
{
while(n!=0)
{
it++;
n--;
}
}else
{
while(n!=0)
{
it--;
n++;
}
}
}
//单向操作指针特化
template <class InputIterator,class Distance>
void __advance(InputIterator& it,Distance n, input_iterator_tag)
{
while(n!=0)
{
it++;
n--;
}
}
template <class InputIterator,class Distance>
void advance(InputIterator& it,Distance n)
{
__advance(InputIterator& it,Distance n,iterator_category(it));
}
//distance实现
//对原生态指针特化
template<class InputIterator,class Distance>
void __distance(InputIterator first,InputIterator last,Distance &n,random_access_iterator_tag)
{
n+=last-first;
}
//泛化版本
template<class InputIterator,class Distance>
void __distance(InputIterator first,InputIterator last,Distance &n,input_iterator_tag)
{
while(first!=last)
{
first++;
n++;
}
}
template<class InputIterator,class Distance>
void distance(InputIterator first,InputIterator last,Distance &n)
{
__distance(first, last,n,iterator_category(first));
}
}
#endif // ITERATOR_H_INCLUDED