繁体   English   中英

为什么clojure中的矢量没有实现dissoc?

[英]Why isn't dissoc implemented for vectors in clojure?

我知道clojure的clojure.lang.IPersistentVector实现了assoc ,如(assoc [0 1 2 3] 0 -1) ; => [-1 1 2 3] (assoc [0 1 2 3] 0 -1) ; => [-1 1 2 3] 我也听过(如在这个答案中)clojure的向量不实现dissoc ,如(dissoc [0 1 2 3] 0) ; => [1 2 3] (dissoc [0 1 2 3] 0) ; => [1 2 3] 如果使用subvec很容易重现这个功能,那么为什么它不应该在clojure.langclojure.core甚至contrib中实现? 如果没有,那背后有什么理由吗?

由于两个原因,Dissoc对向量没有多大意义:

  1. dissoc的意思是“删除密钥”。 您无法从矢量中移除键而不会导致其他副作用(例如,移动所有未来值)
  2. 如果必须移动所有后续键 - 大约O(n)与相当多的GC, dissoc将对向量执行相对较差。 Clojure核心通常避免实现对特定数据结构无效/无意义的操作。

基本上,如果您发现自己想要对向量进行dissoc ,则可能使用了错误的数据结构。 持久性hashmap或set可能是更好的选择。

如果你想要一个数据结构作为向量,但支持有效地剪切和插入元素或子序列,那么值得检查RRB树: https//github.com/clojure/core.rrb-vector

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM