我和一位同事刚刚进行了一次有趣的讨论:
For
和 和有什么不一样For Each
?
在代码中我已经知道它是如何工作的,但是后面呢?真正推荐的是什么?在哪些情况下我们应该使用一种,在哪些情况下使用另一种?
考虑到速度,内存等...
在这里,我给你留下一个非常有趣的参考,但我认为这件事可以进一步澄清。
我和一位同事刚刚进行了一次有趣的讨论:
For
和 和有什么不一样For Each
?
在代码中我已经知道它是如何工作的,但是后面呢?真正推荐的是什么?在哪些情况下我们应该使用一种,在哪些情况下使用另一种?
考虑到速度,内存等...
在这里,我给你留下一个非常有趣的参考,但我认为这件事可以进一步澄清。
在大多数语言中,主要区别在于 a
for
迭代不必存在的事物,并授予我们访问顺序;就其本身而言, anfor-each
迭代必须存在的事物。此外,我们不保证访问它们的顺序。在PHP中
如您所见, 会
for
遍历值的范围0, 1, 2, 3, 4
,但它们都不存在于for
. 你不会遍历任何东西的列表;这些值是即时生成的,并检查它们是否满足条件。在这种情况下,数组的内容会被迭代。这种安排 一定已经存在。它不是自动生成的;值取自先前存在的列表。
只是与上一个略有不同。同样,这些值取自一个已经存在的列表。
C++
几乎与PHP相同。自动生成一个值,并检查它是否满足某个条件。此值不必存在 于
for
.遍历容器,从第一个元素到最后一个元素。
那么,C++ 的情况就不同了。调用对象的某个函数,只要满足某个条件就更新生成的对象。由于所涉及的函数是用户生成的......好吧,我们真的不知道这些值是否存在于
for
. 它可以被认为是多价的极端情况。但是,引入这种形式是为了使容器更易于使用;因此,在其最初的概念中,我们可以得出结论,就像PHP一样,它循环遍历在.
for
趋势
似乎趋势是朝着
for-each
C++ 语言形式发展;调用那些真正为我们提供真正价值的辅助函数。这种工作方式非常通用,但它意味着一定的额外成本(通常,特别是在非编译语言中,函数调用比调用语言提供的运算符更昂贵)。
与容器一起使用的效率
如果想要以非编译语言迭代
for-each
容器中的数据, .这已经离题了,但粗略地说,在解释语言中,对象或字典或它们所称的任何东西通常通过树或哈希表(不太常见)实现。
使用树实现,从一个节点到下一个节点的访问相对容易;简单地访问一个指针就足够了,这几乎没有立即的(形式
for-each
不保证访问各种值的顺序)。但是,访问元素
Contenedor[5]
需要从树的根开始遍历树,比较键,直到找到要查找的键。比前一种情况慢得多。方坯“洋葱爷爷”,注意:
每种语言都有其变体,但是,如果我们回到最初的概念,for 循环是一个具有一定数量(在开始之前)迭代的循环:
如果您事先不知道迭代次数,则必须使用 while 循环:
如此多的假设是,在 Pascal 或 Modula-2 等语言中,条件是在开始时设置的并且是不可变的。例如,下面的代码:
它没有产生无限循环,而是执行了 5 次,即使在最后一次迭代后 n 为 10,因为在循环开始时检查了条件与 n 的值。
但随后 C 出现并为混音创造了一个“混蛋”:
这个 for 的语法甚至不会强迫您使用计数器或在循环体中包含代码:
所以我们今天有 while 和 for 之间没有区别
forEach 循环几乎是对原点的回归:只要您不使用 a
break
,迭代次数就是您正在循环的集合中的元素数。但是这个循环只提供了一个更简单的语法,功能甚至比“经典” for 循环少,因为我们不知道元素的索引,因此我们不能做一些基本的事情,比如删除它或替换它与我们正在巡回演出的收藏中的另一个 Java 示例:在更多函数式语言中,例如 javascript 或 Java 8,他们给了它更多的转折来支持并行性,我们直接有一个隐藏循环的函数:
并且它也无法停止,因此创建了一些其他功能,例如一些,过滤器,查找......不需要遍历整个集合。
坯料结束。现在我回答使用哪一个?:
使用最适合您需要的循环:forEach 循环具有更清晰的语法,不需要声明索引,并且在大多数情况下,编译器会将其转换为经典的 for 循环(例如,在 Java 中使用迭代器),所以性能将非常相似。
我认为根据需要,您将使用其中一种。
for-each
就语法而言,他更舒服,他的阅读简单明了。什么是优势for
更加模棱两可,并增加了一点复杂性,您更有可能弄错一些参数。所有这些都与风格有关,但性能差异(后面)我知道在用户眼中它们实际上很少,如果不是没有的话。
另一件事是知道我们在谈论什么语言,因为 Javascript 到 C++ 通过 C#