【发布时间】: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