Erlang数组vs列表

时间:2015-02-23 14:47:52

标签: arrays performance list erlang comparison

我是Erlang的新手,所以我正在研究一个示例程序,并努力决定是否应该使用数组或列表。两者都很容易创建和处理,但我没有得到:

  • 如何将项目附加到数组而不知道应该在哪里添加索引。 array:set(array:size(A),"a",A)是要走的路吗?
  • 如何确定某个元素是否是数组的成员,就像lists:member()函数一样。我是否必须遍历整个数组并检查每个元素?

最后,哪一个在性能方面更好?

2 个答案:

答案 0 :(得分:2)

列表是Erlang VM的原生数据类型。数组实现为嵌套元组的结构。

列表可用于模式匹配。数组不应该是。

正如@ zxq9所提到的,除非很明显你不应该使用列表,否则应该使用列表。我认为你应该使用数组的唯一一次是对集合执行大量随机更新。否则只需使用一个列表。

  • 如前所述,可以使用array:set(array:size(A),"a",A)附加到数组。可以使用["a"|A]在列表前添加。当然,如果你想要附加到列表,你可以运行lists:reverse,然后是["a"|A],然后再拨打lists:reverse
  • 要检查数组中是否存在项目,可以将数组转换为列表(array:sparse_to_list(A))。然后在结果列表中调用lists:member/2

有关此处可用的阵列实现的更多信息:https://stackoverflow.com/a/16464349/1245380

答案 1 :(得分:1)

如果您认为可能需要像list:member / 2这样的函数,请使用列表:o)

当有意义通过索引访问任何元素时,数组会带来价值,避免列表探索或无聊的元组匹配,如{_,_,_,_,_,_,N,_,_,_,_} = Tuple,很好地被N = array:get(6,Array)取代。 (或element(7,Tuple),但使用元组,你没有map,sparse_pap,foldl ......)。