STL的六大容器之iterator----自定义范式

Posted ypdxcn

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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 };

 



以上是关于STL的六大容器之iterator----自定义范式的主要内容,如果未能解决你的问题,请参考以下文章

STL六大组件

STL 六大部件

ACM常用STL容器

STL之迭代器(iterator)

STL迭代器(iterator)

STL迭代器(iterator)