2016-07-17 18 views
1

我使用向量来构建一个实现动态编程程序的表,它涉及到顺序更新向量的每个元素。但为什么没有不变的矢量vector-set,可变矢量只有vector-set!,但是我们可以看到有dict-setdict-set!用于不可变和可变字典,对于不可变和可变的哈希表也有hash-sethash-set!更新不可变向量的元素

+2

你说得对,有在功能'矢量set'操作没有内置。然而,有些库提供直接支持这一点的持久性向量。例如[pvector](http://docs.racket-lang.org/pvector/index.html)库支持[set-n](http://docs.racket-lang.org/collections/collections- api.html#%28def ._%28%28lib._data%2Fcollection..rkt%29._set-n%29%29)和[update-nnth](http://docs.racket-lang.org/collections /collections-api.html#%28def._%28%28lib._data%2Fcollection..rkt%29._update-nth%29%29)功能更新的操作。 –

+0

@AlexKnauth谢谢pvector,但我想知道为什么?原因不能有'vector-set'。 – fluter

+1

'pvector'库不需要复制整个矢量来进行功能更新,因为它的结构如何。但是内置的向量不具有这种结构,所以一个内置向量的函数'向量集'将不得不复制整个事物。这可能是它遗漏的原因之一,但我不确定。 –

回答

2

vector-set缺失的原因是为了防止人们无意中使用它而不意识到操作是O(n)而不是O(1)。由于vector-set!O(1)对于有人犯这个错误不是不可能的。

此外,它是简单写一个vector-set当真正需要它:

#lang racket 

(define (vector-set v i o) 
    (vector->immutable-vector 
    (for/vector ([j (in-range (vector-length v))]) 
    (if (= i j) 
     o 
     (vector-ref v j))))) 

(vector-set (vector-immutable 10 11 12 13) 2 'a) 

输出:

'#(10 11 a 13) 
+0

感谢您的回答! – fluter