31

我是 C++ 新手,所以请多多包涵。我试图理解 STL iterator_traits。在“The C++ Standard Library”一书中,结构iterator_traits定义如下:

template <class T>
struct iterator_traits {
  typedef typename T::value_type value_type;
  typedef typename T::difference_type difference_type;
  typedef typename T::iterator_category iterator_category;
  typedef typename T::pointer pointer;
  typedef typename T::reference reference;
};

所以在我看来,它正在重新暴露T已经暴露的子类型。再往前走,这本书给出了一个如何使用它的例子,就像下面这样

template <class MyIterator>
void do_something(MyIterator start, MyIterator end) {
    typedef typename iterator_traits<MyIterator>::value_type value_type; 
    value_type v = *start;
    .....
}

我的问题是为什么我iterator_traits在这里需要这个结构,如果我的想法是获得value_type,我不能MyIterator直接从那里获得它吗?我的困惑似乎源于我(肯定不正确)理解子类型的信息必须来自template <class T>用于实例化iterator_trait. 因此,如果您能解释一下,最好举个例子,我为什么需要以及在哪里需要 iterator_traits,这将非常有帮助。

4

1 回答 1

29

指向数组的指针可以用作随机访问迭代器。

对于指针(显然不能将类型声明为嵌套类型,因为只有类可以具有嵌套类型)和类类型迭代器,需要有一些一致的方法来获取这些类型。特征类模板提供了这种一致的方式。

iterator_traits模板专门用于如下指针:

template <typename T>
struct iterator_traits<T*>
{
    typedef std::random_access_iterator_tag iterator_category;
    typedef T                               value_type;
    typedef T*                              pointer;
    typedef T&                              reference;
    typedef std::ptrdiff_t                  difference_type;
};
于 2011-07-19T03:34:06.990 回答