在 Clojure 中添加向量的惯用方法是什么? [英] What is the idiomatic way to prepend to a vector in Clojure?

查看:26
本文介绍了在 Clojure 中添加向量的惯用方法是什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

添加到列表很容易:

user=> (conj '(:bar :baz) :foo)
(:foo :bar :baz)

附加到向量很容易:

user=> (conj [:bar :baz] :foo) 
[:bar :baz :foo]

我如何(惯用地)添加到向量,同时取回向量?这不起作用,因为它返回的是序列,而不是向量:

How do I (idiomatically) prepend to a vector, while getting back a vector? This does not work as it returns a seq, not a vector:

user=> (cons :foo [:bar :baz])     
(:foo :bar :baz)

这很难看(IMVHO):

This is ugly (IMVHO):

user=> (apply vector (cons :foo [:bar :baz])) 
[:foo :bar :baz]

注意:我基本上只想要一个可以附加和前置的数据结构.附加到大列表应该会有很大的性能损失,所以我想到了向量..

Note: I basically just want a datastructure that I can append and prepend to. Appending to large lists should have a large performance penalty, so I thought of vectors..

推荐答案

向量不是为前置而设计的.你只有 O(n) 前置:

Vectors are not designed for prepending. You have only O(n) prepend:

user=> (into [:foo] [:bar :baz])
[:foo :bar :baz]

您想要的很可能是 finger 树.

这篇关于在 Clojure 中添加向量的惯用方法是什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆