1
我使用向量來構建一個實現動態編程程序的表,它涉及到順序更新向量的每個元素。但爲什麼沒有不變的矢量vector-set
,可變矢量只有vector-set!
,但是我們可以看到有dict-set
和dict-set!
用於不可變和可變字典,對於不可變和可變的哈希表也有hash-set
和hash-set!
。更新不可變向量的元素
我使用向量來構建一個實現動態編程程序的表,它涉及到順序更新向量的每個元素。但爲什麼沒有不變的矢量vector-set
,可變矢量只有vector-set!
,但是我們可以看到有dict-set
和dict-set!
用於不可變和可變字典,對於不可變和可變的哈希表也有hash-set
和hash-set!
。更新不可變向量的元素
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)
感謝您的回答! – fluter
你說得對,有在功能'矢量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)功能更新的操作。 –
@AlexKnauth謝謝pvector,但我想知道爲什麼?原因不能有'vector-set'。 – fluter
'pvector'庫不需要複製整個矢量來進行功能更新,因爲它的結構如何。但是內置的向量不具有這種結構,所以一個內置向量的函數'向量集'將不得不復制整個事物。這可能是它遺漏的原因之一,但我不確定。 –