C ++迭代器模型与Java迭代器模型[关闭]
Posted
技术标签:
【中文标题】C ++迭代器模型与Java迭代器模型[关闭]【英文标题】:C++ Iterator model versus Java Iterator model [closed] 【发布时间】:2013-05-27 15:28:24 【问题描述】:C++ 的 STL 的基本迭代器模型基本上由一个“给我当前位置的项目”运算符 *
、一个“转到下一个项目”运算符 ++
和一个谓词 ==
/@987654326 组成@ 用于(大部分时间)检查结束迭代器。当然,还有各种进一步的随机访问迭代器,但最基本的一个看起来像上面描述的那样。
相比之下,Java 有next()
和hasNext()
。接下来大致相当于使用++
,然后使用*
。 hasNext()
类似于与结束的比较。为什么Java没有采用C++模型(当然它没有运算符重载,所以它必须通过函数来模仿它)?特别是,为什么对于 hasNext()
方法与结束迭代器的比较被丢弃了?我发现用 Java 编写迭代器通常比用 C++ 更难,因为 next()
和 hasNext()
背后的逻辑通常比 C++ 运算符中的逻辑更复杂。
【问题讨论】:
看到这篇文章***.com/questions/56347/…和***.com/questions/882855/… “为什么不是 SO 用户的人在 10 多年前做出决定”不是 SO 问题的好形式。 另外,我猜对于链表,Java 的迭代器可能比 C++ 的更容易编写。对于树或潜在的无限列表来说更是如此。 (但这确实是一个猜测,我几乎不知道 C++ 的工作原理。)从概念上讲,Java 的迭代器似乎更加抽象,而 C++ 的目的是让一切看起来像一个数组。这也是 Gosling 刻意避免的那种“运营商过度滥用”。 Java 迭代器还避免了向每个函数传递开始和结束。 现在我真的很想知道如何为二叉树制作 C++ 预排序迭代器。开始和结束对象是什么样的?带有子树的链式迭代器的 Java 实现将非常简单。 【参考方案1】:首先你必须明白C++有指针,而迭代器模拟指针。
Java没有指针,Java中的一切都是对象
C++ 交互器要强大得多。
查看上述 cmets 的重复答案。
Iterators in C++ (stl) vs Java, is there a conceptual difference?
What is the difference between iterators in Java and C++?
我建议您阅读 Java 中如何处理对象 - Objects in Java
【讨论】:
【参考方案2】:也许您应该将 C++ 迭代器与具有索引访问的 Java ListIterator 进行比较。 Java 的迭代器适用于所有类型的集合,并避免使用 O(n) 访问可能出现的低效索引访问。那是一个选择。当然,可以对子列表进行迭代,获得大致相同的结果。
在 Java 7 中,迭代器已经拥有第二公民身份,就像for (item : collection)
一样。
在 Java 8 中提供 collection.forEach(function)
。
Java 8 forEach
是一个明确的改进:来自外部的迭代器维护一个状态。 forEach
由集合类本身完成。这会对表现力(流畅的组合)、效率、并发性和优化产生影响。 (可以在别处阅读。)
【讨论】:
我不确定 Java 8 是如何实现的,但我会在forEach
上赌一把,最终还是会使用 Collection 的 Iterator
。
@millimoose 基本正确;宣传承认,但随后可以做类似parallel().forEach(...)
的事情。更重要的是,迭代器需要一个开放的类。 tree.forEach 可以简单地是一个访问树步行。 还没有调查。【参考方案3】:
原谅我的英语
1,java风格的迭代器就像c++的前向迭代器类,即c++迭代器的一部分
2,在c++中,迭代器只是STL的一部分,在c++中定义一个新的迭代器不仅意味着你可以遍历一个数据集,还意味着你可以使用整个STL的能力,非常强大;
【讨论】:
以上是关于C ++迭代器模型与Java迭代器模型[关闭]的主要内容,如果未能解决你的问题,请参考以下文章