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

fcg9iug3  于 12个月前  发布在  其他
关注(0)|答案(6)|浏览(150)

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

ezykj2lf

ezykj2lf1#

“遍历”只是指遍历数据结构的(全部或部分)元素。
从历史上看,计算机科学中的“迭代”是一种特殊形式的递归,它不需要额外的堆栈空间1-换句话说,tail recursion。这种形式在计算上完全等同于我们现在俗称的“迭代”,即有限循环(例如具有固定上下界的for循环)。
现在这使得迭代特别适合(与一般递归相比)遍历线性数据结构2。注意它不适用于 all 容器(例如一般图),因为这里你需要记住已经访问过的节点(例如使用depth-first search,它是根据相邻节点递归定义的,而不是通过C迭代器的概念)。
正是在这种情况下,术语“迭代”在C
中用于容器。
总而言之:不是每个遍历都是一次迭代,但每个迭代(在数据结构上)都是一次遍历。然而,值得注意的是,许多人没有这样的区别,并互换使用这些术语。
[1]特别是SICP的Gerald Sussman的用法。
[2]但是看起来非线性的数据结构,比如树,可以通过应用右手法则(沿墙算法)来线性化,从而可以在没有堆栈的情况下遍历。

vbopmzt1

vbopmzt12#

AFAIK他们是同义词。是什么让你认为有区别?
我觉得;)“transverse”有时用来表示内部结构被利用。你通过从父节点到子节点来遍历树,或者你通过跟随下一个指针来遍历列表。
另一方面,你需要遍历数组。你有所有的元素,只需一个接一个地遍历它们。

rkue9o1l

rkue9o1l3#

注意:我只是编造了这个定义,但它符合我的心理模型,所以我就跟着它走。
迭代是离散的,遍历可能是也可能不是。所以,你可以遍历扬声器上模拟音量旋钮上允许的音量范围,但你不能遍历它们。
但是迭代是一种遍历,所以每个迭代都是一个遍历,但不是每个遍历都是一个迭代。

qoefvg9y

qoefvg9y4#

我会称iterator为“agent”,而traverse为“action”。实际上,当人们将traversing称为iterating时,我经常感到困惑(因为对我来说,iteration与通过迭代收敛到数学点的数值方法有关)。另一方面,即使我也可以互换使用这两个词。
你不能在没有traversal概念的容器上iterate。至少,为了traverse某些东西,你至少需要知道你是否有邻居,以及如何到达它。

mpgws1up

mpgws1up5#

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

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

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

cu6pst1q

cu6pst1q6#

导线:通过并考虑或讨论一个主题的整个范围。通过一系列考虑或讨论一个主题的整个范围的可行的动作来穿越或延伸。基本上通过一个主题的项目。
Iterate:重复执行某个操作,并将其应用到上一次应用的结果中。

所以
根据定义,transverse并不关心你正在经历什么或如何经历,只关心你覆盖了整个主题(但不一定是上下文中的每个项目)。transverse重复一个过程,可以应用于遍历的每一步。

对于具有条目集合的任何主题:

遍历 遍历条目 * 并覆盖整个主题。
重复 重复一个过程 *,可以在遍历某个内容时针对每个条目。

注意事项:* 遍历不是一种遍历 *,它本质上是一个重复的动作。例如,forforeach循环的迭代可以遍历某些东西,但是你可以遍历每个块,就像在whiledo while循环中一样,不需要遍历任何东西。

相关问题