Vector 在Common Lisp中,如何使动态向量再次成为简单向量?

Vector 在Common Lisp中,如何使动态向量再次成为简单向量?,vector,common-lisp,Vector,Common Lisp,我希望使用向量,将:可调和:填充指针设置为true,以便将内容推送到向量上,但一旦推完内容,我希望能够在向量上使用svref,以便更快地访问。有没有一种好方法可以将此类向量转换为简单向量?您不能取消向量对象的可调整性和填充指针,但可以将其内容复制到新向量: (make-array (array-dimensions my-adjustable-vector) :element-type (array-element-type my-adjustable-vector) :init

我希望使用向量,将:可调和:填充指针设置为true,以便将内容推送到向量上,但一旦推完内容,我希望能够在向量上使用svref,以便更快地访问。有没有一种好方法可以将此类向量转换为简单向量?

您不能取消向量对象的可调整性和填充指针,但可以将其内容复制到新向量:

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

不会(明确)调整或有填充指针。无论这是否真的是一个性能胜利——它涉及到预付制作新数组和复制元素的成本,或者释放旧数组,或者(如果有其他引用)保持这两种状态——当然取决于您的应用程序。

您不能取消矢量对象的可调整性和填充指针,但可以将其内容复制到新的矢量:

(make-array (array-dimensions my-adjustable-vector)
    :element-type (array-element-type my-adjustable-vector)
    :initial-contents my-adjustable-vector)
不会(明确)调整或有填充指针。这是否真的是一个性能上的胜利——它包括预先支付制作新数组和复制元素的成本,或者释放旧数组,或者(如果有其他引用)保留两者——当然取决于您的应用程序。

请参阅强制

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)
见胁迫

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)

获得相同结果的简单方法是:(subseq my可调向量0)获得相同结果的简单方法是:(subseq my可调向量0)