问题标签 [iterator-traits]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
4154 浏览

c++ - 部分特化中未使用的模板参数

我有以下代码:

现在我正在尝试对iterator_traits. 对我来说似乎没问题,但 g++ 4.4.5 抱怨:

这是完整的错误消息:

0 投票
1 回答
7994 浏览

c++ - iterator_trait 的典型用例是什么

我是 C++ 新手,所以请多多包涵。我试图理解 STL iterator_traits。在“The C++ Standard Library”一书中,结构iterator_traits定义如下:

所以在我看来,它正在重新暴露T已经暴露的子类型。再往前走,这本书给出了一个如何使用它的例子,就像下面这样

我的问题是为什么我iterator_traits在这里需要这个结构,如果我的想法是获得value_type,我不能MyIterator直接从那里获得它吗?我的困惑似乎源于我(肯定不正确)理解子类型的信息必须来自template <class T>用于实例化iterator_trait. 因此,如果您能解释一下,最好举个例子,我为什么需要以及在哪里需要 iterator_traits,这将非常有帮助。

0 投票
4 回答
8343 浏览

c++ - 特化 iterator_traits

我想专门std::iterator_traits<>研究一个容器类模板的迭代器,它没有通常的嵌套 typedef(如value_typedifference_type等)并且我不应该修改其源代码。基本上我想做这样的事情:

除了这不起作用,因为编译器无法TContainer<T>::iterator.

有什么可行的方法来实现同样的目标吗?


例如:

现在假设我std::count()使用这个类的一个实例来调用。据我所知,在大多数 STL 实现中,count()返回iterator_traits<Iterator>::difference_type. 的主要模板iterator_traits<I>只是typedef typename I::difference_type difference_type. 与其他嵌套类型相同。

现在在我们的示例中,这显然行不通,因为没有Container::iterator::difference_type. 我想我可以在不修改迭代器类的情况下解决这个问题,专门iterator_traits针对 any 的迭代器Container<T>

最后,我只想能够使用标准算法,如计数、查找、排序等,最好不修改任何现有代码。我认为整点iterator_traits就是:能够为不支持内置的迭代器类型指定类型(如 等)value_typediff_type不幸的是,我无法弄清楚如何为Container<T>.

0 投票
2 回答
180 浏览

c++ - 从可变参数推导迭代器类别

我该如何填写???

template<class...Itrs> struct itr_category { typedef /* ??? */ type; };

所以这type是最专业的,iterator_traits<Itrs>::iterator_category...它支持所有' 操作,否则如果没有单个此类类别,则Itrs失败(如)?enable_if<false>::type

最特iterator_category化是指以下继承中最下降的类型 ( ):

因此,例如,类似的事情itr_category<InputIterator,OutputIterator,...>会失败。

注意:这是一个不同于定义的层次结构std::iterator_traits(参见 24.3 或http://en.cppreference.com/w/cpp/iterator/iterator_tags):这里forward_iterator_tag派生自input_iterator_tagandoutput_iterator_tag而不仅仅是前者。这对应于例如 SGI 文档中描述的继承(参见http://www.sgi.com/tech/stl/Iterators.html)。如果它是相关的,请随意评论这种差异(顺便说一下,这是 zip 迭代器实现的一部分)。

0 投票
2 回答
2099 浏览

c++ - const_iterator 和 const_iterator::value_type 的 constness

为什么在 STL 中

是同一类型

为什么会这样设计?第一个不应该是const T而第二个不应该是T吗?您应该如何采用迭代器的底层 const 正确类型?我知道您可以编写自己的模板类和专业化并从中获取

但不应该有一个成员 typedef 持有它吗?

0 投票
1 回答
504 浏览

c++ - 前向迭代器是输出迭代器吗?

ForwardIterators 是否必须是 OutputIterators?我当前的 STL 实现 (VS2012) 源自forward_iterator_tagand input_iterator_tagoutput_iterator_tag但我在标准 [N3485] 中找不到这个要求。

0 投票
1 回答
672 浏览

c++ - 定义前向输出迭代器的规范方法

如何以规范的方式在 C++11 中定义前向输出迭代器?

根据标准,forward_iterator 只是一个 input_iterator。所以对应的forward_iterator_tag只有extends input_iterator_tag。如果我们std::iterator用来定义我们的迭代器,我们使用什么标签来定义前向输出迭代器?

定义一个扩展两者的私有标签是否规范,forward_iterator_tag或者output_iterator_tag是否有更好的解决方案?

0 投票
4 回答
1078 浏览

c++ - 为什么 back_insert_iterator/front_insert_iterator/insert_iterator 的 value_type/difference_type/pointer/reference 都是 void?

在我的项目中,我想将流拆分为某种给定类型的值,因此我将模板函数实现为

我认为这很尴尬,因为我必须TElem在调用它时明确给出类型。例如,我必须写:

我试图从(模板)迭代器中获取值类型,std::iterator_traits并按如下方式使用:

但是,上述代码不适用于back_insert_iterator. back_insert_iterator/front_insert_iterator/insert_iterator我检查了命名空间中的源代码,std发现value_type/difference_type/pointer/reference都是void.

我想知道为什么这些类型都是void,有什么考虑吗?另一个问题是,是否可以在SplitSpace调用时不显式给出元素类型来实现该函数?谢谢。

0 投票
4 回答
504 浏览

c++ - 具有两个迭代器的循环置换

我需要对列表进行循环排列,例如我有:(a,b,c,d,e)我想要(e,a,b,c,d)。但我没有成功,这里是我尝试过的:

我得到这个:tmp:a,first:a tmp:a,first:a tmp:a,first:a tmp:a,first:a tmp:a,first:a

我不知道为什么,我的主要:

如果你知道为什么不犹豫...

0 投票
2 回答
587 浏览

c++ - 为什么 reverse_iterator 双重定义它的嵌套类型?

似乎迭代器适配器reverse_iterator双重定义了它的大多数嵌套类型。特别是,它公开继承std::iterator暴露的iterator_categoryvalue_typedifference_type和。除了and ,这些都在类定义中再次显式定义。pointerreferenceiterator_categoryvalue_typetypedef

24.5.1.1 类模板 reverse_iterator [reverse.iterator]

问题:为什么重复定义?这仅仅是为了说明,还是有更多的意义?为什么不重新定义iterator_categoryand value_type