Java中的迭代器与C++;? 如何实现Java中的迭代器与C++中的迭代器不同?< P> C++没有指定java实现的迭代器。但是,它确实指定了它们的接口和它们必须提供的最低行为,以便与其他标准库组件一起工作

Java中的迭代器与C++;? 如何实现Java中的迭代器与C++中的迭代器不同?< P> C++没有指定java实现的迭代器。但是,它确实指定了它们的接口和它们必须提供的最低行为,以便与其他标准库组件一起工作,java,c++,iterator,Java,C++,Iterator,例如,对于输入迭代器,该标准指定迭代器必须通过*运算符取消引用。但是,它没有指定如何实现该操作符。实现完全由标准库供应商/JRE供应商分别在C++/Java中定义。只要它们的行为符合各自的标准,它们就可以随意实现它们。C++迭代器(STL)通过运算符重载尽量模拟指针语法 标准规范定义了各种迭代器概念(如前向、双向、随机访问、输入、输出)。每个概念应该匹配一个特定的接口(例如,+ +运算符,用于前迭代器,以顺序进入下一个元素,用于双向,+,+=用于随机访问等)。 < P>在当前C++(98)标准库

例如,对于输入迭代器,该标准指定迭代器必须通过*运算符取消引用。但是,它没有指定如何实现该操作符。

实现完全由标准库供应商/JRE供应商分别在C++/Java中定义。只要它们的行为符合各自的标准,它们就可以随意实现它们。

C++迭代器(STL)通过运算符重载尽量模拟指针语法

标准规范定义了各种迭代器概念(如前向、双向、随机访问、输入、输出)。每个概念应该匹配一个特定的接口(例如,+ +运算符,用于前迭代器,以顺序进入下一个元素,用于双向,+,+=用于随机访问等)。

< P>在当前C++(98)标准库中(特别是以前称为STL的部分)定义了一个非常接近C指针的迭代器形式。(包括算术)。因此它们只是指向某个地方。为了有用,您通常需要两个指针,以便可以在它们之间进行迭代。我知道C++0x引入的范围更像Java迭代器

Java引入了
迭代器
(和
列表迭代器
)1.2中的接口,在很大程度上取代了更详细的枚举。Java没有指针算法,因此不需要像指针一样运行。它们有一个
hasNext
方法来查看它们是否已经结束,而不需要两个迭代器。缺点是它们灵活性较低。系统需要方法作为
subLi包含列表中的特定点是st,而不是在两个迭代器之间进行迭代

<> P>样式的一般区别在于,C++通过模板使用“静态多态”,java使用接口和通用动态多态性。


<迭代器的概念是提供胶水,允许“算法”(真的控制流)和数据容器的分离。这两种方法都相当好。在理想情况下,“正常”代码几乎不应该看到迭代器。

C++中,你看到人们一直在绕过迭代器。C++迭代器“点”。到容器的特定元素。您可以取消对迭代器的引用以获取元素(您可以反复执行此操作)。您可以高效地删除迭代器引用的元素。您还可以复制迭代器(通过分配给另一个变量,或通过值向函数传递迭代器)在同一时间内跟踪多个位置。C++中的Iterators可以根据容器上的某些操作而“失效”,这取决于容器。当迭代器失效(规则可能复杂)时,迭代器的操作具有未定义的行为,并且可能(不一致)。使程序崩溃或返回不正确的结果;尽管在某些数据结构中(例如,

std::list
),迭代器在容器的大多数修改中仍然有效


Java中的迭代器指向两个元素之间,而不是“at”元素。使用迭代器获取元素的唯一方法是将其向前移动以获取移动的元素。当然,这会更改迭代器的状态,并且您不能返回;除非您有一个
ListIterator
,在这种情况下,您可以向前和向后移动(但为了保持静止而不得不前后移动仍然很烦人)。您不能复制迭代器,因为接口不公开公共复制方法;例如,您不能只将特定位置的标记传递给函数,而不向该函数提供对您拥有的相同迭代器的引用,从而允许它们更改迭代器的状态。在Java中,迭代器将无效通过迭代器自己的
add()
remove()
方法以外的任何容器修改来标注日期(至少在标准容器中),这是过于保守的(例如,对
LinkedList
的大多数修改不应影响迭代器)。当您尝试使用无效迭代器时,它会引发
ConcurrentModificationException
(名称混乱,因为它与并发无关)不要可能导致未定义的行为,这很好。

你必须更明确地回答你的问题。你的问题到底是什么?也许你喜欢读这个:@litb刚刚读完这个!!Java没有指定任何一个;迭代器是一个接口。我不认为有任何真正的方法来回答这个问题C++库(以前称为STL)是非常精确的,它定义了迭代器概念应该如何实现。@汤姆- C++语言是由ISO标准指定的,我可以向您保证,在该文档中提到迭代器应该如何实现。或者您可能使用的是“实现”字。在某种特殊意义上?我用的是“实现”这个词在字典意义上,提问者似乎在做。你的答案似乎是在叫喊一个代码猴子树。在像java和C++这样的OO语言中,通常区分接口和实现。提问者使用后一个术语,我认为这就是他所要问的。这确实是W的一个不同的应用。ORD实现。我认为没有一个好的答案来回答这个问题,但是这是一个。+1没有“C++(97)标准库”这样的东西。在ISO 14882中描述的C++标准出现在1998,并且在20被更新。