Clojure中矢量和列表中conj的行为差异

时间:2013-07-28 17:09:55

标签: list vector clojure

我是clojure的新手,最初我正在浏览Clojure.orgcheatbook

我想知道conj在列表和向量上的不同行为的确切原因。

(conj [1 2 3] 4)
[1 2 3 4]

(conj (list 3 2 1) 4) 
(4 3 2 1)

当我在列表中使用它时,它会在第一个位置添加元素,并使用向量添加到最后位置。

1 个答案:

答案 0 :(得分:22)

conj程序根据具体类型在“不同'位置'添加新元素”。特别是,conj在给定数据结构的最有效位置添加新元素。

在单链表中,插入新元素的最便宜位置在头部 - 没有必要遍历列表以找到插入点,只需将新元素与列表的第一个元素连接即可。

在向量中,最便宜的位置在最后 - 不需要移动或移动其余元素以为新元素腾出空间,并且如果向量是使用额外的可用空间创建的,实际大小大于它的当前长度(如瞬态向量和conj!的情况,但不是持久向量),这是一个简单的问题,即在第一个空闲位置添加新元素并将其长度增加一个单位。