如何在clojure中创建一个大向量

Art*_*ldt 6 clojure

如何分配带有1042个空索引的向量?
它的存储空间会被懒散分配吗?
像这样

(def a (array-creation-function 1042))
(def b (assoc a 1041 42))
(b 1041) 
--> 42
Run Code Online (Sandbox Code Playgroud)

Art*_*ldt 14

似乎向量不是稀疏的,因此在创建向量时必须为每个索引指定一个值.最简单的方法似乎是在序列上调用(vec).

(vec (repeat 1042 nil))
Run Code Online (Sandbox Code Playgroud)

似乎懒得创造这些价值观.


Bri*_*per 5

如果你想要的东西不是懒惰但可以避免一些开销,你可以这样做:

(vec (make-array Object 1024))
Run Code Online (Sandbox Code Playgroud)

注意,assoc不改变向量,它返回一个新的向量,其中一个值已更改.向量是不可变的.您的代码将永远无法发布.

  • `make-array`返回一个Java数组,但将它包装在`vec`中会使它成为一个Clojure向量. (2认同)

mik*_*era 5

如果您的数据是稀疏的,那么考虑使用空地图而不是矢量....然后您可以免费获得无限数量的懒惰分配的空索引!

(def a {})
(def b (assoc a 1041 42))
(b 1041) 
--> 42
Run Code Online (Sandbox Code Playgroud)