【问题标题】:Do you have to implement multiple iterators in a STL-like class?您是否必须在类似 STL 的类中实现多个迭代器?
【发布时间】:2011-11-10 15:19:30
【问题描述】:

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

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

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

【问题讨论】:

  • 这取决于容器,例如只有一些容器具有随机访问迭代器。关于const,我认为每个迭代器都有一个const 版本
  • 是的,我知道那部分 - 只有序列容器具有随机访问权限,关联不能,因为它会使隐式排序无效。你知道 const 版本是否是同一个迭代器,只是 typedef 吗?因为我认为它以某种方式暴露了不同的功能。
  • @wiso (Out|In)putIterators 通常不会。例如没有办法拥有const_back_inserter
  • @w00te: const_iterator 具有相同的功能,只是在适当的位置将const 添加到返回类型。 container::const_iteratorconst container::iterator 不一样,所以它不仅仅是一个 typedef,但如果你从头开始编写数据结构,你通常可以编写一个模板,用于 container::iteratorT 作为模板参数,container::const_iteratorconst T

标签: c++ stl


【解决方案1】:

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

您可以通过从std::iterator 继承来获得大多数类型定义,但这不会对您的实际实现提供任何帮助。

Boost.Iterator Facade 尝试简化定义您自己的迭代器,该教程很有帮助。

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

【讨论】:

  • 可以在here 找到迭代器概念和<iterator> 标头(包含std::iteratorstd::iterator_traits)内容的快速回顾()
  • 请注意:通常,如果您不从头开始,则在某种程度上,您已经有了一个迭代器。在这种情况下,迭代器适配器更容易:)
  • 我是唯一一个认为这个答案具有误导性的人吗?听起来好像您必须为您支持的每个类别实现迭代器,这是错误的。
  • @pmr:我没有得到每个概念一个的印象,但我不认为“很多”意味着 2,因此我有点想知道您的其他想法。我猜康拉德在谈到迭代器概念时仍然想知道这一点。
  • @pmr 第一句话不受约束:“你需要很多迭代器才能完全……兼容”;请注意,OP 是在 STL 容器都实现多个迭代器类别的假设下运行的,您基本上会说“是的,您需要做同样的事情”。
【解决方案2】:

一般情况下,您只需实现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> 的不同类型,因为符合标准的程序可以区分(例如,通过比较类型ID)。
  • @Steve Jessop 也许吧。说实话,我从来没有真正想过以任何其他方式实现反向迭代器的想法。
  • 我也是。我猜如果出于某种特殊原因编写代码以相反的顺序迭代容器更容易,您可能更喜欢编写该迭代器并将其用作X::reverse_iterator,然后将reverse_iterator<X::reverse_iterator> 用作X::iterator。但我只是现在才发明的,我从来没有想过要这样做,而且我不能立即想到一个具有双向迭代器的数据结构,并且你会关心你去的顺序。
猜你喜欢
  • 2011-02-09
  • 2022-01-08
  • 2011-01-22
  • 1970-01-01
  • 2023-03-27
  • 2012-02-26
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多