迭代和遍历之间有什么区别?

FJa*_*Jam 12 c++ iteration terminology traversal data-structures

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

Kon*_*lph 19

"遍历"只意味着遍历数据结构的(全部或部分)元素.

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

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

在这种情况下,术语"迭代"用于应用于容器的C++中.

总结:并非每次遍历都是迭代,但每次迭代(在数据结构上)都是遍历.但是,值得注意的是,许多人没有做出这样的区分,并且可以互换地使用这些术语.


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

2但是看似非线性的数据结构(例如树)可以通过应用右手规则(墙跟踪算法)进行线性化以便迭代,因此可以在没有堆栈的情况下遍历.

  • +1,我喜欢遍历是一个更通用的术语,而迭代用于具有自然顺序视图的数据结构. (2认同)

Sar*_*ien 5

AFAIK 他们是同义词。是什么让您认为存在差异?

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

另一方面,您迭代的是一个数组。你已经拥有了所有的元素,只需一一完成它们即可。

  • @FJam,我很确定没有区别。 (2认同)

Ben*_*ley 5

注意:我刚刚完成了这个定义,但它符合我的心理模型,所以我会继续使用它.

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

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