STL的六大容器之iterator----自定义范式
STL的iterator组件,分离了容器和算法。
一.规定
在STL体系下定义iterator,要满足规定的一些规范:
1.iterator_category
有5中分类,决定胃具体的操作,如:++,--,!=,==等,归纳为:
Input_iterator:只读,不写
output_iterator:只写,不读
forward_iterator: 具备向前读写
bidirectional_iterator: 具备向前,向后读写
random_access_iterator: 提供算数能力 ,如+=,-=
2.value_type
模版类型
3.pointer
模版类型的指针类型
4.reference
模版类型的引用类型
5.difference_type
一般为ptrdiff_t(系统定义好的)
二.系统预定的要素
由于要定义满足条件的iterator,规矩较多,按照标准做出要求的5个名子,看一下C++标准的定义:
1 template<class _Category, 2 class _Ty, 3 class _Diff = ptrdiff_t, 4 class _Pointer = _Ty *, 5 class _Reference = _Ty&> 6 struct iterator 7 { // base type for iterator classes 8 typedef _Category iterator_category; 9 typedef _Ty value_type; 10 typedef _Diff difference_type; 11 12 typedef _Pointer pointer; 13 typedef _Reference reference; 14 };
自定义的时候只需要派生就好了,如下:
//泛型版本 template <class T> class my_iterator : public std::iterator<forward_iterator_tag, T> { }; //特化版本 class my_iterator : public std::iterator<forward_iterator_tag, double> { };
当然,你不想派生,也可以自己写,只要由这几个名字就可以了:
1 //forward_iterator_tag,ptrdiff_t是C++标准定义好的,前者表示类型,只是一个标记,后者椒一个整形,表示迭代器之间的距离值。 2 //泛型版本 3 template <class T> 4 class my_iterator 5 { 6 typedef forward_iterator_tag iterator_category; 7 typedef T value_type; 8 typedef ptrdiff_t difference_type; 9 typedef T* pointer; 10 typedef T& reference; 11 }; 12 13 //特化版本 14 class my_iterator 15 { 16 typedef forward_iterator_tag iterator_category; 17 typedef double value_type; 18 typedef ptrdiff_t difference_type; 19 typedef double* pointer; 20 typedef double& reference; 21 };
三。获取iterator的类型
系统定义好了三个版本的萃取类型,可以方便取得规定要素的类型信息,供需要的时候,3个版本:一般版本,指针特殊版本,const指针特殊版本,定义如下:
1 template<class iterator> 2 struct iterator_traits 3 { 4 typedef typename iterator::iterator_category iterator_category; 5 typedef typename iterator::value_type value_type; 6 typedef typename iterator::difference_type difference_type; 7 typedef typename iterator::pointer pointer; 8 typedef typename iterator::reference reference; 9 }; 10 11 template<class T> 12 struct iterator_traits<T*> 13 { 14 typedef random_access_iterator_tag iterator_category; 15 typedef T value_type; 16 typedef ptrdiff_t difference_type; 17 typedef T* pointer; 18 typedef T& reference; 19 }; 20 21 template<class T> 22 struct iterator_traits<const T*> 23 { 24 typedef random_access_iterator_tag iterator_category; 25 typedef T value_type; 26 typedef ptrdiff_t difference_type; 27 typedef const T* pointer; 28 typedef const T& reference; 29 };