迭代和遍历有啥区别?

Posted

技术标签:

【中文标题】迭代和遍历有啥区别?【英文标题】:What is the difference between iteration and traversing?迭代和遍历有什么区别? 【发布时间】:2013-04-26 00:00:59 【问题描述】:

过去几周我一直在学习迭代器。我仍然不明白遍历链接列表和遍历链接列表之间的主要区别。我知道遍历意味着遍历(访问每个元素)链接列表,并且在迭代时你基本上做同样的事情,但有什么不同,为什么你不能遍历所有内容(标准库数据结构)?

【问题讨论】:

iteratortraverses 一个容器。 【参考方案1】:

“遍历”只是指遍历数据结构的(全部或部分)元素。

从历史上看,计算机科学中的“迭代”是一种特殊形式的递归,不需要额外的堆栈空间1——换句话说,tail recursion。这种形式在计算上完全等同于我们现在俗称的“迭代”,即有限循环(例如具有固定下限和上限的for 循环)。

现在这使得迭代特别适合(与一般递归相比)遍历线性数据结构2。请注意,它不适用于 所有 容器(例如通用图),因为在这里您需要记住已经访问过的节点(例如使用 depth-first search,它是根据相邻节点递归定义的,而不是通过 C++ 的迭代器概念)。

正是在这种情况下,术语“迭代”在 C++ 中用于容器。

总而言之:不是每次遍历都是一次迭代,而是每次迭代(在数据结构上)都是一次遍历。然而,值得注意的是,许多人并没有这样区分,而是互换使用这些术语。


1 特别是SICP成名的Gerald Sussman的用法。

2 但是看似非线性的数据结构(例如树)可以通过应用right-hand rule (wall-following algorithm) 进行线性化以实现迭代,因此可以在堆栈的情况下进行遍历.

【讨论】:

not every traversal is an iteration你有这方面的例子吗? @misteryeti 是的,我的回答是:breadth-first search。然而,depth-first search 是一个更好的例子,因为它显式使用堆栈(或递归),而 BFS 经常使用队列代替(但这并没有改变)。 @misteryeti 好吧,您实际上可以遍历树,因为它们具有明确定义的结构(并非每个图都是树!),但这需要一些非平凡的操作。我实际上不知道标准库是如何实现这一点的……但由于标准库的复杂性要求,我希望标准库树迭代器实际上 do 迭代。 让我们continue this discussion in chat +1,我喜欢这样的想法:遍历是一个更通用的术语,而迭代用于具有自然顺序视图的数据结构。【参考方案2】:

注意:我刚刚提出了这个定义,但它符合我的心理模型,所以我会继续这样做。

迭代是离散的,遍历可能是也可能不是。因此,您可以在扬声器上的模拟音量旋钮上遍历允许的音量范围,但不能遍历它们。

但迭代是一种遍历。所以每次迭代都是一次遍历,但不是每次遍历都是一次迭代。

【讨论】:

【参考方案3】:

迭代器基本上为您提供了遍历数据结构的功能 - 访问每个元素。我会打电话给traversingiterating 同义词。有iterators,但是编程中不知道traversers

and why cannot you iterate through everything(STL datastructures)?

一些数据结构没有允许这样做的信息。例如,在堆栈上,您不应该遍历所有元素,因为您只能访问堆栈的顶部。

【讨论】:

所以它们基本相同? 迭代器是一个帮助你遍历某物的对象。我称之为“遍历”和“迭代”的同义词。有迭代器,但我不知道编程中的“遍历器”:)【参考方案4】:

我会将iterator 称为“代理”,将traverse 称为“行动”。实际上,当人们将traversing 称为iterating 而不是某些东西时,我常常感到困惑(因为对我来说iteration 与通过迭代收敛到数学点的数值方法有关)。另一方面,即使我也可以互换使用这些词。

您不能在没有traversal 概念的容器上使用iterate。至少,为了traverse 某事,您至少需要知道您是否有邻居,以及如何找到它。

【讨论】:

【参考方案5】:

AFAIK 他们是同义词。是什么让你觉得有区别?

我觉得 ;) “遍历”有时用于表示内部结构被利用。您可以通过从父节点到子节点来遍历树,或者通过跟随下一个指针来遍历列表。

另一方面,您迭代的数组。您拥有所有元素,只需逐个处理它们即可。

【讨论】:

@FJam,我很确定没有区别。

以上是关于迭代和遍历有啥区别?的主要内容,如果未能解决你的问题,请参考以下文章

发布和迭代有啥区别?

价值迭代和策略迭代有啥区别? [关闭]

迭代和递归有啥区别?

open() 的缓冲参数和迭代文件时使用的硬编码预读缓冲区大小有啥区别?

JavaScript - 在 for 循环中使用 let 和 var 关键字声明迭代变量有啥区别? [复制]

deque 和 list STL 容器有啥区别?