问题标签 [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.
c++ - 部分特化中未使用的模板参数
我有以下代码:
现在我正在尝试对iterator_traits
. 对我来说似乎没问题,但 g++ 4.4.5 抱怨:
这是完整的错误消息:
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,这将非常有帮助。
c++ - 特化 iterator_traits
我想专门std::iterator_traits<>
研究一个容器类模板的迭代器,它没有通常的嵌套 typedef(如value_type
、difference_type
等)并且我不应该修改其源代码。基本上我想做这样的事情:
除了这不起作用,因为编译器无法T
从Container<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_type
。diff_type
不幸的是,我无法弄清楚如何为Container<T>
.
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_tag
andoutput_iterator_tag
而不仅仅是前者。这对应于例如 SGI 文档中描述的继承(参见http://www.sgi.com/tech/stl/Iterators.html)。如果它是相关的,请随意评论这种差异(顺便说一下,这是 zip 迭代器实现的一部分)。
c++ - const_iterator 和 const_iterator::value_type 的 constness
为什么在 STL 中
是同一类型
为什么会这样设计?第一个不应该是const T而第二个不应该是T吗?您应该如何采用迭代器的底层 const 正确类型?我知道您可以编写自己的模板类和专业化并从中获取
但不应该有一个成员 typedef 持有它吗?
c++ - 前向迭代器是输出迭代器吗?
ForwardIterators 是否必须是 OutputIterators?我当前的 STL 实现 (VS2012) 源自forward_iterator_tag
and input_iterator_tag
,output_iterator_tag
但我在标准 [N3485] 中找不到这个要求。
c++ - 定义前向输出迭代器的规范方法
如何以规范的方式在 C++11 中定义前向输出迭代器?
根据标准,forward_iterator 只是一个 input_iterator。所以对应的forward_iterator_tag
只有extends input_iterator_tag
。如果我们std::iterator
用来定义我们的迭代器,我们使用什么标签来定义前向输出迭代器?
定义一个扩展两者的私有标签是否规范,forward_iterator_tag
或者output_iterator_tag
是否有更好的解决方案?
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
调用时不显式给出元素类型来实现该函数?谢谢。
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
我不知道为什么,我的主要:
如果你知道为什么不犹豫...
c++ - 为什么 reverse_iterator 双重定义它的嵌套类型?
似乎迭代器适配器reverse_iterator
双重定义了它的大多数嵌套类型。特别是,它公开继承std::iterator
暴露的iterator_category
、value_type
、difference_type
和。除了and ,这些都在类定义中再次显式定义。pointer
reference
iterator_category
value_type
typedef
24.5.1.1 类模板 reverse_iterator [reverse.iterator]
问题:为什么重复定义?这仅仅是为了说明,还是有更多的意义?为什么不重新定义iterator_category
and value_type
?