你是否必须在类似STL的类中实现多个迭代器?

6
我非常熟悉STL及其使用方法。我的问题是......
如果我要实现自己的STL容器类型,内部迭代器如何定义?STL类倾向于具有顺序或随机访问迭代器,这些迭代器的const_版本以及流迭代器。
这些迭代器是否在每个STL类中都完全定义,还是有一些基类可以继承以获得大多数迭代器功能?是否有人知道一个好的参考资料来实现支持这些不同类型迭代器的类?

这取决于容器,例如只有一些容器具有随机访问迭代器。关于“const”,我认为每个迭代器都有一个“const”版本。 - Ruggero Turra
是的,我知道这一点 - 只有序列容器具有随机访问,关联容器不能具有随机访问,因为它会使隐式排序无效。你知道const版本是否只是typedef过的相同迭代器吗?因为我认为它以某种方式暴露了不同的函数。 - John Humphreys
@wiso (Out|In)put迭代器通常不会。例如,没有办法拥有一个const_back_inserter - pmr
@w00te:const_iterator 除了在适当的位置添加“const”到返回类型之外,具有相同的功能。container::const_iterator 不同于 const container::iterator,因此它不仅仅是一个 typedef,但如果您从头开始编写数据结构,通常可以编写一个模板,将 T 作为模板参数用于 container::iterator,并使用 const T 用于 container::const_iterator - Steve Jessop
2个回答

7

通常情况下,只需要实现iteratorconst_iterator。如果需要反向迭代器,则可以使用std::reverse_iterator进行实例化获得。流迭代器将使用operator>>operator<<;通常它们不适用于容器(也没有任何标准容器提供它们)。


我认为你可以更进一步地说,可逆容器必须使用std::reverse_iterator。请参见表格66(23.1/9),它确切地说明了类型X::reverse_iteratorX::const_reverse_iterator是什么。如果容器中的typedef想要绕个弯路到达那里,也可以,但我理解的方式是不允许使用像reverse_iterator<X::iterator>这样的不同类型,因为符合规范的程序可以通过比较typeids来区分它们。 - Steve Jessop
1
@Steve Jessop 可能吧。说实话,我从来没有想过以其他方式实现反向迭代器的想法。 - James Kanze
我也是这么认为的。我猜如果由于某种奇怪的原因,以相反的顺序迭代容器的代码更容易编写,那么你可能更喜欢编写该迭代器并将其用作X::reverse_iterator,然后将reverse_iterator<X::reverse_iterator>作为X::iterator。但是我刚刚才想到这个,我从来没有考虑过这样做,并且我不能立即想出一个具有双向迭代器的数据结构,而您会关心遍历的顺序。 - Steve Jessop

4

是的,您需要使用两个不同的迭代器才能完全符合stdlib标准。

通过继承std::iterator,您可以正确获取大多数typedef,但这无法帮助您实际实现。

Boost.Iterator Facade试图简化定义自己的迭代器,并且该教程非常有帮助。

如果您尝试在没有帮助程序的情况下进行操作,您应该考虑您的迭代器模型的概念,然后查看C++标准§24中的表格。它们描述了您需要支持的所有操作以及预期的语义。


迭代器概念和<iterator>头文件(包含std::iteratorstd::iterator_traits)的内容简要回顾,请点击此处查看(给出通常有关cplusplus.com不可靠的说明)。 - Matteo Italia
一个注意事项:通常,如果你不是从头开始编程,你已经有了一个迭代器。在这种情况下,迭代器适配器更容易使用 :) - Matthieu M.
1
我是唯一一个觉得这个答案误导人的吗?它让人觉得你必须为每个支持的类别实现迭代器,这是错误的。 - Konrad Rudolph
@Konrad 我不知道怎么会有这种印象。请随意通过编辑来解决这个问题。 - pmr
1
@pmr:我没有得到每个概念一个的印象,但我不认为“许多”意味着2,因此我有点想知道您还有哪些其他的概念。我猜Konrad在到达迭代器概念部分时仍然在想这个问题。 - Steve Jessop
1
@pmr 第一句话没有限制:“你需要许多迭代器才能完全符合……的要求”;请注意,OP在假设STL容器都实现了多个迭代器类别的情况下进行操作,而你基本上是说“是的,你也需要这样做”。 - Konrad Rudolph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接