我读到向量不是序列,但列表是。我不确定使用一个而不是另一个的理由是什么。似乎向量是使用最多的,但这是有原因的吗?
发布于 2009-07-18 17:28:18
再一次,我似乎已经回答了我自己的问题,不耐烦地在Freenode上的#clojure中问了这个问题。在Stackoverflow.com上鼓励回答自己的问题是件好事:D
我和Rich Hickey进行了一次简短的讨论,下面是讨论的要点。
[12:21] <Raynes> Vectors aren't seqs, right?
[12:21] <rhickey> Raynes: no, but they are sequential
[12:21] <rhickey> ,(sequential? [1 2 3])
[12:21] <clojurebot> true
[12:22] <Raynes> When would you want to use a list over a vector?
[12:22] <rhickey> when generating code, when generating back-to-front
[12:23] <rhickey> not too often in Clojure
发布于 2009-07-18 17:06:46
如果您做过大量的Java编程,并且熟悉Java集合框架,那么可以考虑像LinkedList
这样的列表和像ArrayList
这样的向量。所以你可以用同样的方法来选择容器。
进一步的说明:如果您打算在序列的前面或后面单独添加项,链表比向量好得多,因为这些项不需要每次都打乱顺序。然而,如果你想频繁地获取特定的元素(而不是列表的前面或后面)(例如,随机访问),你会想要使用vector。
顺便说一句,向量可以很容易地转换成序列。
user=> (def v (vector 1 2 3))
#'user/v
user=> v
[1 2 3]
user=> (seq v)
(1 2 3)
user=> (rseq v)
(3 2 1)
发布于 2009-07-18 17:19:53
向量的随机访问时间为O(1),但它们必须预先分配。列表可以动态扩展,但访问随机元素是O(n)。
https://stackoverflow.com/questions/1147975
复制相似问题