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迭代器模型[关闭]的主要内容,如果未能解决你的问题,请参考以下文章

用于可迭代对象的 Java GraphQL 解析器:休眠异常

java设计模式---迭代器模式(案例解析)

C++map与set模拟实现

C++map与set模拟实现

C++map与set模拟实现

c ++速度比较迭代器与索引