在使用矢量图的Flash Player 10中,为什么还需要使用数组?

5

如果您的目标是Flash Player 10,那么有理由坚持使用数组作为默认列表数据结构吗?为什么不在整个程序中将Vectors(类型化数组)作为默认值,因为它们具有以下优点:

  • 更快
  • 类型检查

它的性能表现差或者产生更高的内存开销吗?还有什么理由使用数组吗?

5个回答

5

有很多原因。例如,向量不是稀疏的,因此如果您的向量索引为999,则您具有1,000个元素的数组。在标准数组中,您可能只有一个元素。


2
一个向量可以选择是固定长度的,这意味着它的长度不能改变。而且你永远不能一次性向数组中添加多个元素(出于答案中提到的原因)。话虽如此,基于你所提到的两个原因,向量非常好用。 - Robusto
你走在正确的道路上,但我已经为向量和数组的理想用法制定了方案。请查看我的答案。 - Robin Rodricks

4

根据我对此问题的了解,我将回答自己的问题。

仅针对以下数据类型,向量才更快: -- (证明)

  • int
  • uint
  • Number
  • Boolean

数组则适用于所有其他类型:

  • 字符串

向量使用时更加受限制:

  • 读取/写入进行边界检查
    • 不能直接设置不存在的插槽,例如 [5] = Val
    • 不能读取不存在的插槽(否则会抛出异常)
  • 必须通过push()创建插槽
  • 排序速度较慢

向量使用起来更加麻烦:

  • 多维数组无法转换为向量
  • 向量无法转换为多维数组
  • 无法使用String.split()
  • 所有元素都具有相同的固定类型 - 无法用于JSON

向量可以更容易地进行调试:

  • 将[向量 of ints]设置为[向量 of Vector of ints]会抛出异常
  • 编译时错误(在某些情况下)
    • 尝试将[向量 of ints]设置为[向量 of Strings]时
    • 尝试将[向量 of ints]设置为[向量 of Vector of ints]时

有趣。我一直在想,他们将如何替换我用作各种ListBase导数据提供程序的各种集合类。我看到的一个巨大缺点是,您无法像使用ArrayCollection那样设置Vector的源。您甚至可以使用Array.slice()从另一个数组实例化简单的Array。向量必须迭代增长,我猜。我现在有点想知道我将用这些做什么。 - Robusto
如果您不介意,Jarvis,我有几个问题:为什么数组对于字符串更可取,以及您为什么无法使用String.split()? - Panzercrisis

2
也许特别是当您不知道类型时 - 它是一种基于宽松的列表。比如,使用JSON数据。
编辑:哦,这里还有另一个半原因 - String.split()。它将返回一个字符串数组。不知道为什么不能得到Vector.,真烦人。
话虽如此,在Flash 10+中,99%的时间您将使用Vectors。所有关于Vectors的“缺点”都只适用于非常特定(通常很少见)的用例。

谢谢您的帮助,但我已经回答了自己的问题,希望它能帮助您更广泛地了解这个主题。 - Robin Rodricks

1

正如Robusto所说,向量不是稀疏的。虽然这可能对大小来说不好,但它对速度非常有利。因此,如果您不需要非常稀疏的数据结构(实现这些稀疏结构也需占用一些额外的空间),您可以充分利用速度。

这是典型的权衡:内存与速度之间的平衡 :-)


我回答了自己的问题,希望能帮助你对这个主题有更广泛的理解。 - Robin Rodricks

1

这取决于你想做什么。尝试对向量进行排序?这将需要更长的时间。你是否需要拼接数组或向量?如果是这样,你可能想放弃它们并使用链表。如果你正在寻找具有命名键且需要引用的内容,则可能会使用字典。这是一个模糊、无用的答案——“这取决于情况”——但确实如此。之所以有这么多不同的数据列表结构,是有原因的。


检查我的答案,伙计们!希望能有所帮助。 - Robin Rodricks

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接