迭代器是一种行为类似指针的对象,而指针的各种行为中最常见的便是解引用(*)和成员访问(->),此外还有operator++。因此,迭代器最重要的编程工作是对operator*和operator->进行重载工作。关于这部分的代码,可以参考class auto_ptr。
迭代器一般会和某种容器相关联,指向某种类型的元素,这种元素的类型(value_type)叫做相应类型。常用的相应类型有五种:
value_type:迭代器所指对象的类型。
difference_type:两个迭代器之间的距离。
reference:容器内元素的引用。
pointer:容器内元素的指针。
iterator_category:表示迭代器类型,根据迭代器类型激活重载函数。关于这一点,可以参考STL算法advance()。
如果某个函数的返回类型为迭代器的相应类型,那么靠“模板实参推断”是无法实现的,而“特性萃取”技术能够很好的解决这个问题。
为了获得迭代器的相应类型,STL采用了一种称为特性萃取的技术,能够获得迭代器(包括原生指针)的相应类型:
~~~
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 T>
struct iterator_traits<T*> { // 特化版本,接受一个T类型指针
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef T* pointer;
typedef T& reference;
};
template <class T>
struct iterator_traits<const T*> { // 特化版本,接受一个T类型const指针
typedef random_access_iterator_tag iterator_category;
typedef T value_type;
typedef ptrdiff_t difference_type;
typedef const T* pointer;
typedef const T& reference;
};
~~~
当然,为了符合STL规范,用户自定义的迭代器必须添加这些相应类型,特性萃取机才能有效运作。
参考:
《STL源码剖析》 P80、P85.
- 前言
- 顺序容器 — heap
- 关联容器 — 红黑树
- 关联容器 — set
- 关联容器 — map
- 关联容器 — hashtable
- 关联容器 — hash_set
- 关联容器 — hash_map
- 算法 — copy
- 顺序容器 — stack
- 顺序容器 — queue
- 顺序容器 — priority_queue
- 顺序容器 — slist
- construct()和destroy()
- 空间配置器
- 函数适配器
- 迭代器以及“特性萃取机”iterator_traits
- 算法 — partial_sort
- 算法 — sort
- 仿函数
- 适配器(adapters)
- C++简易vector
- C++简易list
- STL算法实现
- C++模板Queue