代码之家  ›  专栏  ›  技术社区  ›  Arthur Ulfeldt

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

  •  6
  • Arthur Ulfeldt  · 技术社区  · 16 年前

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

    (def a (array-creation-function 1042))
    (def b (assoc a 1041 42))
    (b 1041) 
    --> 42
    
    4 回复  |  直到 14 年前
        1
  •  14
  •   Arthur Ulfeldt    16 年前

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

    (vec (repeat 1042 nil))
    

    这些价值观似乎并不是懒惰地创造出来的。

        2
  •  5
  •   Brian Carper    16 年前

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

    (vec (make-array Object 1024))
    

    注: assoc 不更改向量,它返回一个值已更改的新向量。向量是不可变的。您的代码将永远不会像发布的那样工作。

        3
  •  5
  •   mikera    14 年前

    如果您的数据如此稀疏,那么考虑使用空映射而不是向量….然后您就可以免费获得无限数量的延迟分配的空索引!

    (def a {})
    (def b (assoc a 1041 42))
    (b 1041) 
    --> 42
    
        4
  •  4
  •   Andrew    16 年前
    (apply vector (take 1024 (repeat nil)))
    

    …懒惰

    推荐文章