更新不可变向量的元素 - vector-set
Update element of immutable vector - vector-set
我正在使用向量构建一个 table 来实现动态程序,它涉及按顺序更新向量的每个元素。但是为什么 immutable 向量没有 vector-set
呢? mutable 向量只有 vector-set!
,但是我们可以看到 immutable 和 mutable 字典有 dict-set
和 dict-set!
,还有 hash-set
和 hash-set!
用于 immutable 和 mutable 哈希 tables.
之所以缺少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)
我正在使用向量构建一个 table 来实现动态程序,它涉及按顺序更新向量的每个元素。但是为什么 immutable 向量没有 vector-set
呢? mutable 向量只有 vector-set!
,但是我们可以看到 immutable 和 mutable 字典有 dict-set
和 dict-set!
,还有 hash-set
和 hash-set!
用于 immutable 和 mutable 哈希 tables.
之所以缺少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)