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_trait
的template <class T>
。因此,如果您能解释一下,最好举个例子,我为什么需要以及在哪里需要 iterator_traits,这将非常有帮助。
【问题讨论】:
你有多少新?新手一般不会玩template
s。
@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<IteratorLikeClass>
来适应它。以上是关于iterator_trait 的典型用例是啥的主要内容,如果未能解决你的问题,请参考以下文章
cudaGraphicsGLRegisterImage中cudaGraphicsRegisterFlagsWriteDiscard的用例是啥?