Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/date/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 您必须在类似STL的类中实现多个迭代器吗?_C++_Stl - Fatal编程技术网

C++ 您必须在类似STL的类中实现多个迭代器吗?

C++ 您必须在类似STL的类中实现多个迭代器吗?,c++,stl,C++,Stl,我非常熟悉STL以及如何使用它。我的问题是 如果要实现自己的STL容器类型,如何定义内部迭代器?STL类往往具有顺序或随机访问迭代器、这些迭代器的常量版本以及流迭代器 这些迭代器是在每个STL类中都完全定义的,还是有某种基类可以继承以获得大部分迭代器功能?有人知道如何实现一个支持这些不同类型迭代器的类的好参考吗?是的,您需要两个不同的迭代器才能完全兼容stdlib 通过从std::iterator继承,可以正确地获得大多数typedef,但这对实际实现没有任何帮助 试图简化定义自己的迭代器,本教

我非常熟悉STL以及如何使用它。我的问题是

如果要实现自己的STL容器类型,如何定义内部迭代器?STL类往往具有顺序或随机访问迭代器、这些迭代器的常量版本以及流迭代器


这些迭代器是在每个STL类中都完全定义的,还是有某种基类可以继承以获得大部分迭代器功能?有人知道如何实现一个支持这些不同类型迭代器的类的好参考吗?

是的,您需要两个不同的迭代器才能完全兼容stdlib

通过从
std::iterator
继承,可以正确地获得大多数typedef,但这对实际实现没有任何帮助

试图简化定义自己的迭代器,本教程非常有用


如果你试图在没有帮助者的情况下做这件事,你应该想想你的迭代器模型是什么概念,然后看看C++标准中的第24条中的表。它们描述了您需要支持的所有操作以及预期的语义。

通常,您只需实现
迭代器
常量迭代器
。
如果需要反向迭代器,可以使用
std::reverse_迭代器的实例化。流迭代器将使用

操作符>>
操作符它取决于容器,例如,只有一些容器具有随机访问迭代器。关于
const
,我认为每个迭代器都有一个
const
versionYeah,我知道只有部分序列容器可以随机访问,而关联容器不能,因为它会使隐式排序无效。您知道常量版本是否与刚才键入的迭代器相同吗?因为我认为它以某种方式暴露了不同的函数。@wiso(Out | In)计算机迭代器通常不会。e、 g.无法使用
const\u back\u插入器
@w00te:const\u迭代器具有相同的功能,除了在适当的位置向返回类型添加
const
container::const_iterator
const container::iterator
不同,因此它不仅仅是一个typedef,但是如果您从头开始编写数据结构,您通常可以编写一个模板,该模板将
container::iterator
作为模板参数,还有
container::const_iterator
const T
。可以找到对迭代器概念和
标题(其中包含
std::iterator
std::iterator_特征
)内容的快速回顾()注意:通常,如果你不是从头开始,你已经有了一个迭代器。在这种情况下,迭代器适配器更容易:)我是唯一一个发现这个答案有误导性的人吗?这听起来好像你必须为你支持的每个类别实现迭代器,这是错误的。@pmr:我没有得到每个概念一个迭代器的印象,但我不认为“多”意味着2,因此我有点想知道你还想到了什么。我猜Konrad在谈到迭代器的概念时仍然很好奇。@pmr第一句话是不受约束的:“你需要很多迭代器才能完全…兼容”;请注意,OP是在STL容器都实现多个迭代器类别的假设下运行的,您基本上会说“是的,您也需要这样做”。我认为您可以进一步说,
std::reverse_iterator
必须用于可逆容器。参见表66(23.1/9),它准确地说明了
X::reverse\u迭代器
X::const\u reverse\u迭代器
的类型。如果需要的话,容器中的typedef可以绕着房子转一圈才能到达那里,但是我不允许用另一种方式读取它,这种方式的行为类似于
反向迭代器
,因为一个符合条件的程序可以分辨出不同之处(例如,通过比较typeid)。@Steve Jessop。说实话,以任何其他方式实现反向迭代器的想法从未真正出现在我的脑海中,我也是。我想,如果出于某种特殊原因,编写代码以反向顺序遍历容器更容易,那么您可能更愿意编写该迭代器并将其用作
X::reverse\u迭代器
,然后将
reverse\u迭代器
用作
X::迭代器
。但我只是刚刚发明了它,我从来没有想过要这么做,我不能马上想到一个数据结构,它会有一个双向迭代器,你会关心你的顺序。