有人可以解释一下,IndexedSeq'之间的区别。和' PersistentVector'?
在通过“休息”更新数据结构中的向量时,我遇到了这个问题。这是一个显示转换的REPL摘录。
=> (def xs [1 2 3])
...
(type xs)
cljs.core/PersistentVector
=> (def xs2 (rest xs))
...
(type xs2)
cljs.core/IndexedSeq
我在app-state原子中持有一个列表,需要偶尔移动一次,所以第一个项目必须消失。真的很酷,如果有人能给我一个关于哪个数据结构在性能方面可能更可取的提示。 有时元素也会被推到列表的末尾,所以我猜它是我在这里创建的LIFO机制。
答案 0 :(得分:1)
从你的上一段开始,听起来你正在使用它作为堆栈。总之,pop
,peek
和conj
形成了一个堆栈接口,可以与列表或向量一起使用(在列表的前面或向量的末尾处理)。我会用那些。
如果您只是使用这些功能,我认为不应该有任何显着的性能差异(所有三个功能应该是恒定的时间)。
答案 1 :(得分:0)
在这里查看超级接口:http://static.javadoc.io/org.clojure/clojure/1.7.0/clojure/lang/IndexedSeq.html
我猜,这不是最有效的事情,因为它只是一个seq,没有保证对第n个成员的恒定时间访问。为了确保向量语义,您应该使用subvec
来删除第一个元素。
一般情况下,如果您不对元素进行随机访问,就性能而言,则应该使用concat
将元素添加到结尾(因为它会生成懒惰的序列,不会消耗整个集合,并且应该在一个恒定的时间内完成)和rest
去除第一个元素(因为它也是在一个恒定的时间内完成),以制作FIFO堆栈(这是你做什么)。 (它仍然不是最好的变体,因为它可能导致堆栈功率流,如果你在没有意识到序列的情况下做了很多push
。
但是确定使用矢量更好。因此,conj
,first
和subvec
的组合应该是您的选择。