我知道clojure的clojure.lang.IPersistentVector
实现了assoc
,就像(assoc [0 1 2 3] 0 -1) ; => [-1 1 2 3]
一样。我也听到(如在this回答中)clojure的向量没有像dissoc
那样实现(dissoc [0 1 2 3] 0) ; => [1 2 3]
。如果使用subvec
轻松重现此功能,是否有任何真正原因导致它不应在clojure.lang
,clojure.core
甚至是contrib中实现?如果没有,那背后有什么理由吗?
答案 0 :(得分:9)
Dissoc对矢量没有多大意义,原因有两个:
dissoc
的含义是"删除密钥"。您无法从矢量中移除某个键而不会产生其他副作用(例如,移动所有未来的值)dissoc
对矢量的表现相对较差 - 大概是O(n)与相当多的GC。 Clojure核心通常避免实施对特定数据结构没有效率/不合理的操作。基本上,如果您发现自己想要对向量执行dissoc
,则可能使用了错误的数据结构。持久性hashmap或set可能是更好的选择。
如果你想要一个数据结构作为向量,但支持有效地剪切和插入元素或子序列,那么值得检查RRB树:https://github.com/clojure/core.rrb-vector