【问题标题】:Should there be an Iterator within another iterator for hierarchical data?分层数据的另一个迭代器中是否应该有一个迭代器?
【发布时间】:2013-09-18 17:40:40
【问题描述】:

我想为我的列表数据维护一个迭代器,但列表数据中有另一个列表,我也想维护它的迭代器。我应该在迭代器中维护一个迭代器吗?两个迭代器应该分开吗?

// iterator interface
class Iterator
{
public:
   boolean hasNext() = 0;
   Object getCurrnetItem() = 0;
   Object next() = 0;
   boolean remove() = 0;
}

// this iterator will iterator the following list
std::vector<MY_SCRUCT> mList;

现在 MY_STRUCT 中有另一个 std::vector 我也需要迭代器。以下将其表示为示例代码:

struct MY_SCRUCT
{
   int numOfObjects;
   std::vector<int> data; // i need iterator for this one too!
} 

我需要维护这两个列表的迭代器,以便我的应用程序可以随时知道当前选定的项目是什么。

我的问题再次是,这些迭代器是否应该分开,是否应该留在另一个内部以对应于该数据结构?

【问题讨论】:

  • 您的班级看起来像来自 Java 土地的移民。请不要。你会迷惑你的 C++ 程序员伙伴。 C++ 有自己的迭代器概念,它们看起来与 Java 中的完全不同。不,您不应该将迭代器放在迭代器中,这确实很奇怪。迭代器是列表中的位置。他们不在乎列表中的内容以及它是否具有某些内部结构。他们只关心给定元素在列表中的位置。
  • +1 你说得对,我从一本遵循 java 的书中获取了代码 sn-p 作为示例。关于迭代器是分开的,你的说法是有道理的,但我仍然会对其他答案感兴趣,因为两个迭代器都只是位置,但它们是相关的,因为一个列表位于另一个列表中。
  • 这是四人组的设计模式。虽然它是 Java 中的默认迭代方式,但它不受 Java 的限制,而且我不仅在其他语言中看到过,而且在 C++ 中也看到过。话虽如此,Stepanov 的迭代器(那些在 C++ 标准库中的)远远优于迭代器模式中的迭代器......
  • @DavidRodríguez-dribeas 是的,我也遵循 GoF,这种设计模式显然适用于多种语言,如果不是全部的话。我不得不不同意 n.m 的观点,因为它只对 java 有好处。
  • Java 迭代器与新的 C++11 for 循环不兼容。 for (auto element : container) 在这里不起作用,因为它明确使用了开始和结束。它也与所有遵循 STL 风格的现有算法不兼容。这不仅仅是标准的,例如我有一个"numeric2.h" 标头。与 boost 容器一起工作,因为我们都同意 STL 样式的迭代器。

标签: c++ design-patterns iterator


【解决方案1】:

我会说把另一个放在里面而不是分开。将相关代码放在一起似乎是一种很好的编码实践。此外,您可以从自身内部创建迭代器对象的实例,而不是创建一个新对象。这样,当您进行 OOP 时,您的迭代器类将具有与您的 struct 类相似的结构(使您的代码更易于管理和易读)。

【讨论】:

    【解决方案2】:

    是否所有想要迭代外部类型的用户也想要迭代内部序列?如果答案不是,那么明确的答案是将它们分开。

    即使所有用例都想在这两个维度上进行迭代,问题仍然以不同的形式存在。您是否要强制要求所有迭代都必须完全跨越两个维度,这有意义吗?

    我个人会避免它。您遍历一个维度并获得Object,对于每个对象如果用户想要,她还可以遍历内部ints。将正交概念绑定到单个迭代中不会以任何方式帮助您,并且可能会排除一些用例。同时,它会使其更难维护。如果它们是分开的并且您添加了一个额外的子元素,则您需要提供对该新子元素的迭代,但您无需触及所有不依赖于新功能的现有代码。

    【讨论】:

    • 内部(int) 是真正的交易,外部(或主要)列表主要用于组织目的。从功能的角度来看,我能给你的最好的类比是一家杂货店一天收到 2 辆装满东西的卡车,所以主列表有两个项目(每辆卡车),而子列表包含那辆卡车里的所有东西。第二天有 5 辆新卡车来了,所以我们相应地组织了这些数据,主要有 5 个项目,依此类推。假设每一天都是分开的。当我显示数据时,我想显示它进入了哪个项目和哪辆卡车 - 因此有两个迭代器。
    • @zadane:您正在描述一种迭代元素的形式,是唯一的吗?如果是,那么您可能希望将对象封装到 Transport 类中,该类在内部处理汽车或卡车、多辆卡车或火车,并提供对内容的单次迭代。一个简单的例子是std::deque
    • 嗯..我认为这就是我组织它的方式减去与迭代器部分的混淆。在我的实际应用程序中,它是批处理。每个批次可以包含多个容器,每个容器可以包含多个项目。我的类数据结构对应于这个层次结构。
    猜你喜欢
    • 2010-09-17
    • 2012-10-23
    • 2013-06-17
    • 1970-01-01
    • 2023-03-17
    • 1970-01-01
    • 2015-09-20
    • 1970-01-01
    • 2014-08-07
    相关资源
    最近更新 更多