Vector 将两个向量与结果向量中的填充指针合并

Vector 将两个向量与结果向量中的填充指针合并,vector,merge,common-lisp,fill-pointer,Vector,Merge,Common Lisp,Fill Pointer,我有两个带填充指针的向量。我需要合并这些向量,并得到一个新的向量,它仍然有一个填充指针 (defparameter*a*(生成数组3:填充指针3 :初始内容(1 3 5))) (defparameter*b*(生成数组3:填充指针3 :初始内容(0 2 4))) (a类*) ;;=> (矢量t6) ;; 推动新元素按预期工作。 (矢量推送扩展7*a*) (矢量推送扩展6*b*) ;; 现在我们通过合并*a*和*b*来创建一个新向量。 (def参数*c*(合并'vector*a**b*#'#(01

我有两个带填充指针的向量。我需要合并这些向量,并得到一个新的向量,它仍然有一个填充指针

(defparameter*a*(生成数组3:填充指针3
:初始内容(1 3 5)))
(defparameter*b*(生成数组3:填充指针3
:初始内容(0 2 4)))
(a类*)
;;=> (矢量t6)
;; 推动新元素按预期工作。
(矢量推送扩展7*a*)
(矢量推送扩展6*b*)
;; 现在我们通过合并*a*和*b*来创建一个新向量。
(def参数*c*(合并'vector*a**b*#'#(01 2 3 4 5 6 7)
(类别*c*)
;;=>(简单向量8)
;此新向量的类型不允许推送元素。
(矢量推送扩展8*c*)
价值
;;   #(0 1 2 3 4 5 6 7)
不是那种类型的
;;(和向量(不是简单数组))
;;;[类型错误的条件]
我似乎找不到要指定的类型,因此结果将有一个填充指针。我想显而易见的解决方法是:

  • 自己编写一个
    merge
    函数,声明一个新向量并按正确顺序执行插入
  • 使用填充指针将结果复制到另一个向量中

当然,如果有一种方法可以使用标准中的
merge
来实现这一点,那么这两种解决方法都是非常不令人满意的。

确实没有简单的方法可以实现 用a返回a 填充指针

但是,可以将向量置换为结果:

(定义参数*c*(合并)(向量t)*a**b*#'(简单向量8)
(def参数*d*(生成数组(长度*c*):替换为*c*:填充指针t))
(d类*)
==>(向量T 8)
*d*
==> #(0 1 2 3 4 5 6 7)
(阵列位移*d*)
==> #(0 1 2 3 4 5 6 7); 0
(矢量推送扩展17*d*)
==> 8
*d*
==> #(0 1 2 3 4 5 6 7 17)
到目前为止还不错,对吧

不,没那么快:

(阵列位移*d*)
=>零;0
当我们打电话的时候 在
*d*
上,它从一个移位的数组转换为一个普通数组 因为潜在的 无法扩展

如果你想的话,你可以考虑使用列表而不是数组。 使用

merge
,因为它在列表上效率更高(重用
结构)。

有什么问题吗
(def参数*d*(生成数组(长度*c*):填充指针(长度*c*):初始内容*c*))
(填充指针*d*)=>8
我没有想到这一点。它是否涉及数组中所有单元格的额外复制操作?我正在测试这个。@ThomasHoullier:是的,这会创建一个新向量并在那里复制数据。好的,我写了一个快速测试,实际上声明这个新向量的操作的执行时间与ar的大小成线性关系雷。谢谢你的回答。事实上,在我这方面,第一次调用
向量推送扩展
的成本非常高。我想我必须切换到列表,或者按照你的建议不使用
合并