在clojure而不是列表矢量中将矢量分成矢量矢量

the*_*ude 7 clojure

split-at的clojure文档声明它采用元素集合并返回两个列表向量,每个列表包含大于或小于给定索引的元素:

(split-at 2 [1 2 3 4 5])
[(1 2) (3 4 5)]
Run Code Online (Sandbox Code Playgroud)

我想要的是这个:

(split-at' 2 [1 2 3 4 5])
[[1 2] [3 4 5]]
Run Code Online (Sandbox Code Playgroud)

这是一个集合,分为两个集合,保持元素的顺序(如向量),最好没有性能损失.

通常的方法是什么,是否有任何性能优化的方法来做到这一点?

Dan*_*eal 12

如果您只使用向量,则可以使用一个选项subvec.

(defn split-at' [idx v]
    [(subvec v 0 idx) (subvec v idx)])

(split-at' 2 [1 2 3 4 5])
;; => [[1 2] [3 4 5]]
Run Code Online (Sandbox Code Playgroud)

关于绩效,关于subvec国家的文件:

该操作是O(1)并且非常快,因为得到的矢量与原始矢量共享结构并且不进行修整.