在Common Lisp中,如何使动态矢量再次变为简单矢量?

时间:2011-03-23 18:43:20

标签: vector common-lisp

我想使用矢量:可调节和:fill-pointer设置为true以便将内容推送到它们上,但是一旦我完成推送操作,我希望能够在它们上使用svref以便更快地访问。是否有一种很好的方法可以将这种矢量转换为简单的矢量?

2 个答案:

答案 0 :(得分:3)

参见COERCE。

CL-USER> (defvar *xxx*)
*XXX*                                                                                                                                                                               
CL-USER> (setf *xxx* (make-array 5 :element-type '(unsigned-byte 8) :initial-element 1 :adjustable t))
#(1 1 1 1 1)                                                                                                                                                                        
CL-USER> *xxx*
#(1 1 1 1 1)                                                                                                                                                                        
CL-USER> (type-of *xxx*)
(AND (VECTOR (UNSIGNED-BYTE 8) 5) (NOT SIMPLE-ARRAY))                                                                                                                               
CL-USER> (coerce *xxx* 'simple-vector)
#(1 1 1 1 1)                                                                                                                                                                        
CL-USER> (type-of *)
(SIMPLE-VECTOR 5)

答案 1 :(得分:2)

你不能带走矢量对象的可调整性和填充指针,但你可以将其内容复制到一个新的矢量:

(make-array (array-dimensions my-adjustable-vector)
    :element-type (array-element-type my-adjustable-vector)
    :initial-contents my-adjustable-vector)

不会(明确地)可调节或具有填充指针。这是否实际上是一次性能上的胜利 - 它涉及到预先支付制作新阵列和复制元素的成本,并且要么释放旧的阵列,要么(如果还有其他参考)保留两者 - 将当然取决于你的申请。