iterator_trait 的典型用例是啥

Posted

技术标签:

【中文标题】iterator_trait 的典型用例是啥【英文标题】:What are the typical use cases of an iterator_traititerator_trait 的典型用例是什么 【发布时间】:2011-07-19 03:30: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 获得它吗?我的困惑似乎源于我(肯定不正确)理解子类型的信息必须来自用于实例化iterator_traittemplate &lt;class T&gt;。因此,如果您能解释一下,最好举个例子,我为什么需要以及在哪里需要 iterator_traits,这将非常有帮助。

【问题讨论】:

你有多少?新手一般不会玩templates。 @iammilind 好吧,我以前学过一些 C 和 Python,所以课程内容有点熟悉。模板不是这样,所以这是我学习新事物的地方。 好吧,如果你全职使用 C++ 10 年,你仍然会在 2021 年学习有关模板的新东西 :-) 嗨!我来自 2021 年;我已经全职使用 C++ 10 年了;而且我可以确认我仍在学习有关模板的新知识。 【参考方案1】:

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

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

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

【讨论】:

啊!所以重点是让do_something 使用指针以及基于类的迭代器。谢谢。 是的。由于其他原因,特征也很有用(例如,在使用 curiously recurring template pattern 时它们非常方便),但这是我们拥有 iterator_traits 的具体原因。 另外,如果您使用不遵循协议的第三方类似迭代器的类,可以通过专门化std::iterator_traits&lt;IteratorLikeClass&gt; 来适应它。

以上是关于iterator_trait 的典型用例是啥的主要内容,如果未能解决你的问题,请参考以下文章

vi 的典型用例是啥?

bash中noop [:]的用例是啥?

cudaGraphicsGLRegisterImage中cudaGraphicsRegisterFlagsWriteDiscard的用例是啥?

NSURLSessions 后台会话的正确用例是啥?

TypeScript 中的“as const”是啥意思,它的用例是啥?

DataSet Spark 的用例是啥?