我想使用矢量:可调节和:fill-pointer设置为true以便将内容推送到它们上,但是一旦我完成推送操作,我希望能够在它们上使用svref以便更快地访问。是否有一种很好的方法可以将这种矢量转换为简单的矢量?
答案 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)
不会(明确地)可调节或具有填充指针。这是否实际上是一次性能上的胜利 - 它涉及到预先支付制作新阵列和复制元素的成本,并且要么释放旧的阵列,要么(如果还有其他参考)保留两者 - 将当然取决于你的申请。