对于迭代,我知道有不同类型的迭代器例如。正向,双向,随机访问,可用于访问阵列中的项目。
对于枚举,我只听说过可用于索引项目的枚举。但是有没有称为“枚举”或枚举器的术语?如果是这样,那么迭代和枚举之间的区别是什么?
答案 0 :(得分:11)
术语与语言紧密相关,并且非常令人困惑。
在C ++中,“enumerat ion ”(enum
)是一个名称,意思是“一堆编号项目“,所以没有行动正在进行;它只是一个的东西(就像一个class
)。
当然,“iterat ion ”是指动作,意思是“多次重复动作”。通常,这会伴随着一系列项目。
但是,在某些语言中,每个语言都具有动作的特定含义:
C#:枚举器是对象,它们遍历集合的项目(如C ++迭代器; IEnumerator<T>
)。迭代器是方法,几乎完全相同,但是以协程式(yield return
)。
C#仍然具有与C ++类似的enumerat ion (enum
s)。
Java:迭代器遍历集合的项目,就像在C ++中一样。我不确定“普查员”。
Java仍然具有类似于C ++的enumerat ion ,但它们也有所不同。
Python:迭代器就像C#枚举器; generator 就像C#迭代器(yield
)。
没有enumerat ion s,AFAIK。
等
答案 1 :(得分:0)
我不确定c ++中是否是这种情况,但在java中,枚举器本质上是一个更快的迭代器,因为它不是线程安全的,因此它没有因为检查线程访问而产生的开销。由迭代器完成。
有关详细信息,请参阅此blog entry。
答案 2 :(得分:0)
基本上C ++的SinglePassIterator,Java的Iterator和C#的IEnumerator都是等价的。
AFAIK Java和C#不提供类似ForwardIterator的功能,可能是因为它们需要“可复制”, 这对虚拟机来说是一项繁重的操作。将新副本转换为数组并进行索引访问比迭代器快得多。