【问题标题】:What's the difference between [] and elementAt in List?List中的[]和elementAt有什么区别?
【发布时间】:2020-08-22 02:22:19
【问题描述】:
var ints = [0, 1, 2, 3];
var foo = ints.elementAt(1);
var bar = ints[1];
assert(foo == bar);

elementAt[] 操作员做同样的工作。两者有什么区别吗?如果没有,那为什么我们可以在它们上使用elementAt,而Iterable类中却没有定义[]

【问题讨论】:

标签: dart


【解决方案1】:

那么当我们可以在它们上使用elementAt 时,为什么在Iterable 类中没有定义[]

您已经回答了自己的问题:不同之处在于 elementAt 是为所有 Iterables 定义的,而 operator [] 不是。

在大多数语言中,[] 通常会快速:它通常是 O(1) 或 O(log n)。允许[] 访问链表的元素在技术上是可行的,但这通常不是一个好主意,因为它会使潜在的性能问题变得不那么明显。大多数人不会期望 someCollection[99] 执行 100 次迭代。

相比之下,elementAt does not make any such guarantee

可以按迭代顺序遍历元素,忽略第一个 index 元素,然后返回下一个。一些可迭代对象可能有更有效的方法来查找元素。

所以任何Iterable 总是可以提供elementAt 实现,这不一定很快,但只有可以提供高效实现的派生类才能提供operator []。对于此类类,elementAt[] 应该相同。

【讨论】:

  • 感谢先生的回答,有时您让我意识到要成为一名程序员,您必须具备计算机科学知识(O(n) 之类的东西在这里)。不过我有几个问题,比如在 Dart 中,哪个更快 elementAt[],我会问后续问题。
  • 正如我所提到的,如果一个类有both elementAt[],它们应该是同一个东西;一个不应该比另一个快。
  • 如果我可以在Iterable 中按索引(使用elementAt)获取元素,那么为什么该类中没有定义运算符[] 属性,使用起来会容易得多[]elementAtIterable
  • 正如我试图解释的那样,使用不同功能(elementAt 而不是[])的意义在于它应该传达可能存在性能差异的信息。使用 elementAt 可能是 O(n) 查找,而 [],如果可用,应该是 O(1) 或可能 O(log n)。链表类从Iterable 派生并提供elementAt 函数是有意义的;如果它提供operator [],那将非常具有误导性。
  • 换一种说法:是的,[] 比使用elementAt 方便得多。提供elementAt [] 的类的重点是故意不方便。由于链表中的索引查找将是 O(n) 而不是 O(1),因此应该不鼓励尝试按索引访问元素。
猜你喜欢
  • 1970-01-01
  • 2011-05-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-26
  • 2020-08-20
  • 1970-01-01
  • 2011-12-16
相关资源
最近更新 更多