2016-07-17 6 views
1

私はベクトルを使って動的プログラミングプログラムを実装するためのテーブルを作成しています。しかし、なぜ不変ベクトルのためにvector-setがないのですか?可変ベクトルの場合はvector-set!しかありませんが、不変および変更可能な辞書の場合はdict-setdict-set!、さらに不変および変更可能なハッシュテーブルの場合はhash-sethash-set!です。不変ベクトルの更新要素

+2

そうだね、何の機能 'ベクトル-set'操作でそこに構築されていません。しかし、これを直接サポートする永続的なベクトルを提供するライブラリがあります。たとえば、[pvector](http://docs.racket-lang.org/pvector/index.html)ライブラリは、[set-nth](http://docs.racket-lang.org/collections/collections- api.html#%28def ._%28%28lib._data%2Fcollection..rkt%29._set-nth%29%29)と[update-nth](http://docs.racket-lang.org/collections /collections-api.html#%28def._%28%28lib._data%2Fcollection..rkt%29._update-nth%29%29)機能の更新を行います。 –

+0

@AlexKnauthはい、pvectorに感謝しますが、なぜですか?その理由は「ベクトルセット」を持つことができなかった。 – 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

関連する問題