我是 clojure 的新手,最初我正在浏览Clojure.org和cheatbook。
我想知道conj
列表和向量上不同行为的确切原因是什么。
(conj [1 2 3] 4)
[1 2 3 4]
(conj (list 3 2 1) 4)
(4 3 2 1)
当我将它与列表一起使用时,它在第一个位置添加元素,并在最后一个位置添加矢量。
我是 clojure 的新手,最初我正在浏览Clojure.org和cheatbook。
我想知道conj
列表和向量上不同行为的确切原因是什么。
(conj [1 2 3] 4)
[1 2 3 4]
(conj (list 3 2 1) 4)
(4 3 2 1)
当我将它与列表一起使用时,它在第一个位置添加元素,并在最后一个位置添加矢量。
该conj
程序“根据具体类型在不同的‘地方’添加新元素”。特别conj
是在给定数据结构最有效的地方添加新元素。
在单链表中,插入新元素最便宜的位置是在头部——不需要遍历列表来找到插入点,只需将新元素与列表的第一个元素连接起来。
在向量中,最便宜的地方是在最后——不需要移动或移动其余元素来为新元素腾出空间,如果向量是用实际大小大于其当前长度的额外可用空间创建的(与瞬态向量 和 一样conj!
,但不是持久向量),只需在第一个空闲位置添加新元素并将其长度增加一个单位即可。