迭代器的分类与从属关系
Input Iterator Output Iterator
|| ||
|| ||
Forward Iterator
|
Bidirectional Iterator
|
Random Access Iterator
要达到最高效率应该选择合适的迭代器
对于不同的迭代器,调用不同的函数
当程序调用advance()等函数时,应调用哪个函数定义呢?
这就应该把函数的不同迭代器版本设计成重载版本,要满足重载的条件,函数就必须提供不同的参数个数或不同类型参数。可以在每个函数加多一个形参,这个形参必须是不同类型,不能只是传递一个整数。
定义五个class,代表不同的迭代器:
迭代器类型标签类: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 InputIterator, class Dintance>
inline void _advance (InputIterator& i, Distance n, input_itertator_tag);
_advance()的最后一个参数都只是声明类别,并未指定名称,因为他纯粹只是用来激活重载机制。
traits技术指的是,提供一个专门的class template来用于萃取特性。例如在stl中的iterator_traits,表现形式为:
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;
};
如果要设计一个对象,并使其能通过iterator_traits 进行萃取,必须在它的定义式里声明value_type等,例如list(对于int,double等变量,可以定义偏特化的traits):
template <class _Tp, class _Alloc = __STL_DEFAULT_ALLOCATOR(_Tp) >
class list : protected _List_base<_Tp, _Alloc> {
public:
typedef _Tp value_type;
typedef value_type* pointer;
typedef const value_type* const_pointer;
typedef value_type& reference;
typedef const value_type& const_reference;
typedef size_t size_type;
typedef ptrdiff_t difference_type;
...
}