首页 / 知识
C ++(stl)与Java中的迭代器在概念上有区别吗?
2023-04-14 23:12:00

Iterators in C++ (stl) vs Java, is there a conceptual difference?在离开了一段时间并尝试清除旧瓜后,我将返回c ++。
在Java中,Iterator是指向具有以下方法的容器的接口:
在C ++标准模板库中,迭代器似乎代表支持
有趣的是,在C ++中,指针是数组的迭代器。 STL吸收了现有内容并围绕其建立约定。 我还缺少进一步的微妙之处吗? 也许有点理论化。从数学上讲,C ++中的集合可以描述为迭代器的半开间隔,即一个迭代器指向集合的开始,而一个迭代器指向最后一个元素。 这种约定为人们带来了无限可能。算法在C ++中的工作方式,都可以应用于更大集合的子序列。为了使这种事情在Java中起作用,您必须围绕返回一个不同迭代器的现有集合创建包装器。 Frank已经提到了迭代器的另一个重要方面。迭代器有不同的概念。 Java迭代器与C ++的输入迭代器相对应,即它们是只读的迭代器,一次只能递增一步,不能向后递增。 另一方面,您有C指针,它们完全对应于C ++的随机访问迭代器的概念。 总而言之,C ++提供了更丰富,更纯净的概念,与C指针或Java迭代器相比,它可以应用于种类繁多的任务。
是的,在概念上有很大的不同。 C ++使用了不同的迭代器"类"。有些用于随机访问(不同于Java),有些用于前向访问(类似于Java)。尽管甚至还有其他人用于写数据(例如与 请参阅C ++文档中的迭代器概念:
与Java / C#的微不足道的迭代器相比,它们更加有趣和强大。希望这些约定将使用C ++ 0x的Concepts进行整理。 如前所述,Java和C#迭代器描述了位置(状态)和范围(值)的混合,而C ++迭代器将位置和范围的概念分开。 C ++迭代器分别表示"我现在在哪里"和"我可以去哪里?"。 Java和C#迭代器无法复制。您无法恢复以前的职位。常见的C ++迭代器可以。 考虑以下示例:
单击上面的链接查看程序输出。 这个相当愚蠢的循环遍历了一个序列(仅使用正向迭代器语义),仅打印一次三个元素的每个连续子序列(最后打印了两个较短的子序列)。但是假设每行有N个元素,每行M个元素,而不是3个,此算法仍将是O(N * M)个迭代器增量和O(1)空间。 Java样式迭代器缺乏独立存储位置的能力。你要么
由于在此示例中仅使用了前向迭代机制,因此我可以毫无问题地交换列表。这对于创作通用算法(例如搜索,延迟的初始化和评估,排序等)至关重要。 无法保留状态与C ++ STL输入迭代器最接近,后者基于很少的算法构建。 指向数组元素的指针确实是数组的迭代器。 如您所说,与C ++相比,在Java中,迭代器对基础容器的了解更多。 C ++迭代器是通用的,一对迭代器可以表示任意范围:这可以是容器的子范围,也可以是多个容器的范围(请参阅http://www.justsoftwaresolutions.co.uk/articles/pair_iterators.pdf或http://www.boost.org/doc/libs/1_36_0/libs/iterator/doc/zip_iterator.html)或什至一系列数字(请参阅http://www.boost.org/doc/libs/1_36_0 /libs/iterator/doc/counting_iterator.html) 迭代器类别标识了给定迭代器可以做什么和不能做什么。 对我来说,根本的区别是Java迭代器指向项目之间,而C ++ STL迭代器指向项目。 关于这些差异,有很多很好的答案,但是我感觉到Java迭代器最让我烦恼的事情没有得到强调-您无法多次读取当前值。这在很多情况下尤其有用,尤其是在合并迭代器时。 在c ++中,您可以使用一种方法来推进迭代器并读取当前值。读取其值不会推动迭代;因此您可以阅读多次。 Java迭代器无法做到这一点,而我最终创建了执行此操作的包装器。 旁注:创建包装器的一种简单方法是使用现有的包装器-Guava中的PeekingIterator。 C ++迭代器是指针概念的概括。它们使它适用于更广泛的情况。这意味着它们可用于执行定义任意范围的操作。 Java迭代器是相对愚蠢的枚举器(尽管不如C#的枚举器差;至少Java具有ListIterator并可用于对集合进行变异)。 C ++库(以前称为STL的一部分)迭代器旨在与指针兼容。没有指针算法的Java可以自由地对程序员更友好。 在C ++中,您最终不得不使用一对迭代器。在Java中,您可以使用迭代器或集合。迭代器被认为是算法和数据结构之间的粘合剂。为1.5+编写的代码很少需要提及迭代器,除非它正在实现特定的算法或数据结构(大多数程序员无需这样做)。随着Java的发展,动态多态子集之类的子集更容易处理。 迭代器仅等效于按顺序遍历数组内容的琐碎情况下的指针。迭代器可以从许多其他来源提供对象:数据库,文件,网络,其他计算等。 |
最新内容
相关内容
linux命令清除日志?
linux命令清除日志?,系统,软件,信息,最新,首次,传播,情况,工具,日志,管理系统,linux删除日志文件的命令1、确认日志记录已删除。最后,您可以手linux命令快速清除?
linux命令快速清除?,系统,档案,命令,位置,名称,不了,文件夹,目录,文件,权限,linux上怎么快速删除一个目录linux删除文件夹的方法有两种:rmdir命linux清除安装命令?
linux清除安装命令?,软件,系统,名称,工具,信息,电脑,终端,命令,程序,面板,linux中RPM命令删除软件问题1、打开linux系统,在linux的桌面的空白处linux清除当前命令?
linux清除当前命令?,系统,工具,命令,文件,指令,终端,进程,步骤,下面,之前,linux清理磁盘空间命令linux怎么清理磁盘空间呢,下面就让我们来看看linux的常用命令清除?
linux的常用命令清除?,数据,工作,命令,文件夹,网络,系统,百度,管理,名字,文件,删除文件夹中所有文件的linux命令(清理垃圾文件的命令是什么)_linux命令行清除一行?
linux命令行清除一行?,数字,数据,命令,时间,资料,系统,文件,光标,文本,功能,Linux命令行操作之sedsed命令行格式为:sed [-nefri] ‘command’linux清除队列命令?
linux清除队列命令?,系统,工作,地址,信息,命令,目录,档案,基础,名称,环境,Linux下的mailq队列出现超时的队列可以清空吗?include linux/msg.hlinux清除密码命令?
linux清除密码命令?,密码,系统,状态,名称,位置,网络,管理,软件,工具,命令,linux怎么重置密码1、命令:passwd [-k] [-l] [-u [-f]] [-d] [-S] [ulinux日志清除命令?
linux日志清除命令?,标准,文件,系统,信息,服务,最新,日志,命令,程序,模式,linux定时清理nohup命令下产生的日志1、nohup命令的缺点:日志文件文linux怎么清除命令行?
linux怎么清除命令行?,系统,环境,档案,命令,数字,地址,文件,目录,指令,光标,linux命令历史首先打开linux客户端。使用鼠标点击连接linux按钮。linux使用命令的方法?
linux使用命令的方法?,系统,信息,工具,标准,数据,命令,左下角,目录,文件夹,图标,linux的cd命令的使用方法1、cd ~:回到用户家目录。注:这得看你linux清除缓存命令?
linux清除缓存命令?,系统,工具,情况,缓存,网络,服务,管理,信息,地址,数据,Linux如何清理ARP缓存?1、Linux 清除arp缓存是把列表标记为(incompl