我是c++新手,所以请原谅我。我试图理解STL iterator_traits
。在《c++标准库》一书中结构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
中获得它吗?我的困惑似乎源于我的(肯定是不正确的)理解,即子类型的信息必须来自用于实例化iterator_trait
的template <class T>
。所以,如果你能解释一下,最好是举个例子,为什么我需要iterator_traits,这将非常有帮助。
指向数组的指针可以用作随机访问迭代器。
对于指针(显然不能将类型声明为嵌套类型,因为只有类可以有嵌套类型)和类类型迭代器,需要有一些一致的方法来获取这些类型。traits类模板提供了这种一致的方式。 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;
};