iterator_trait 的典型用例是什么

2022-01-10 00:00:00 iterator traits c++ stl iterator-traits

我是 C++ 新手,所以请多多包涵.我试图理解 STL iterator_traits.在《C++ 标准库》一书中,iterator_traits 结构体定义如下:

I am new to C++ so please bear with me. I am trying to understand STL iterator_traits. In the book "The C++ Standard Library" the structure iterator_traits is defined as follows:

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 已经公开的子类型.再往前走,书中给出了如何使用它的示例,如下所示

So it seems to me that it is re-exposing the subtypes that T already exposes. Moving ahead further, the book gives an example of how to use it, which is something like the following

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_traittemplate .因此,如果您能解释一下,最好举个例子,我为什么需要以及在哪里需要 iterator_traits,这将非常有帮助.

My question is why do I need this iterator_traits structure here, if the idea was to obtain the value_type, couldn't I have obtained it from MyIterator directly ? My confusion seems to arise from my (surely incorrect) understanding that the information of the subtypes have to be sourced from the template <class T> used to instantiate the iterator_trait. So if you could explain, and preferably with an example why and where would I need iterator_traits that would be very helpful.

推荐答案

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

Pointers into an array can be used as random access iterators.

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

There needs to be some consistent way to get these types both for pointers (which obviously can't have the types declared as nested types, since only classes can have nested types) and for class-type iterators. The traits class template provides this consistent way.

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

The iterator_traits class template is specialized for pointers like so:

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;
};

相关文章