【问题标题】:What are the typical use cases of an iterator_traititerator_trait 的典型用例是什么
【发布时间】:2021-11-12 02:17:15
【问题描述】:

我是 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 年了;我可以确认我仍在学习有关模板的新知识。

标签: c++ stl iterator traits iterator-traits


【解决方案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; 来适应它。
猜你喜欢
  • 2010-11-21
  • 1970-01-01
  • 2010-09-26
  • 1970-01-01
  • 2011-03-17
  • 2019-06-20
  • 1970-01-01
  • 2020-03-27
相关资源
最近更新 更多