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_categoty比较复杂,我们需要使用它来进行参数推导,以便提高效率,我们可以看到下面的声明,因为要进行编译时期的参数推导,我们需要为这些类型定义成类。而不能只是一个typedef。如下的继承关系,越往下iterator的功能越强大,比如random_access_iterator_tag就可以随机访问,拥有此能力的迭代器,我们必须使用他的高级功能以提高效率。
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 {};
如果我要实现一个iterator,如下:
template <class T >
struct myIter
{
typedef bidirectional_iterator_tag iterator_category ;
};
调用时只需:
template <class InputIterator , class Distance >
inline void advance(InputIterator &i , Distance n )
{
__advance( i, n,
iterator_traits <InputIterator >::iterator_category()); //创建临时对象,此对象是无用的,只是为了进行参数推导。
}