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

时间:2013-05-01 22:24:10

标签: c++ data-structures iteration terminology traversal

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

5 个答案:

答案 0 :(得分:17)

“遍历”只意味着遍历数据结构的(全部或部分)元素。

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

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

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

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


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

2 但是看似非线性的数据结构(例如树)可以通过应用right-hand rule (wall-following algorithm)进行线性化以便迭代,因此可以遍历而不用堆栈。

答案 1 :(得分:5)

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

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

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

答案 2 :(得分:4)

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

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

另一方面,你迭代一个数组。你拥有所有元素,只需逐一完成它们。

答案 3 :(得分:3)

我会将iterator称为“代理人”,将traverse称为“行动”。实际上,当人们将某些内容traversing更多地引用iterating而不是iteration某事时(因为对我来说iterate与数字方法有关,这些方法通过迭代会聚到数学点)时,我常常会感到困惑。另一方面,即使我可以互换使用这些词语。

对于没有traversal概念的容器,您不能traverse。至少,为了{{1}}某事,你至少需要知道你是否有邻居,以及如何去做。

答案 4 :(得分:2)

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

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

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