12

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

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

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

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

当我将它与列表一起使用时,它在第一个位置添加元素,并在最后一个位置添加矢量。

4

1 回答 1

24

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

在单链表中,插入新元素最便宜的位置是在头部——不需要遍历列表来找到插入点,只需将新元素与列表的第一个元素连接起来。

在向量中,最便宜的地方是在最后——不需要移动或移动其余元素来为新元素腾出空间,如果向量是用实际大小大于其当前长度的额外可用空间创建的(与瞬态向量 和 一样conj!,但不是持久向量),只需在第一个空闲位置添加新元素并将其长度增加一个单位即可。

于 2013-07-28T17:14:07.537 回答