vector - 在结果向量中使用填充指针合并两个向量
问题描述
我有两个带有填充指针的向量。我需要merge
这些向量,因此有一个仍然具有填充指针的新向量。
(defparameter *a* (make-array 3 :fill-pointer 3
:initial-contents '(1 3 5)))
(defparameter *b* (make-array 3 :fill-pointer 3
:initial-contents '(0 2 4)))
(type-of *a*)
;;=> (VECTOR T 6)
;; Pushing new elements works as intended.
(vector-push-extend 7 *a*)
(vector-push-extend 6 *b*)
;; Now we create a new vector by merging *a* and *b*.
(defparameter *c* (merge 'vector *a* *b* #'<))
;;=> #(0 1 2 3 4 5 6 7)
(type-of *c*)
;;=> (SIMPLE-VECTOR 8)
;; The type of this new vector does not allow pushing elements.
(vector-push-extend 8 *c*)
;; The value
;; #(0 1 2 3 4 5 6 7)
;; is not of type
;; (AND VECTOR (NOT SIMPLE-ARRAY))
;; [Condition of type TYPE-ERROR]
我似乎找不到要指定合并的类型,以便结果将具有填充指针。我想明显的解决方法是:
- 自己编写一个
merge
函数,声明一个新向量并以正确的顺序执行插入。 - 使用填充指针将结果复制到另一个向量中。
当然,如果有一种方法可以使用merge
标准来做到这一点,那么这两种解决方法都非常不令人满意。
解决方案
确实,没有简单的方法可以通过填充指针merge
返回 a 。vector
但是,您可以将向量替换为结果:
(defparameter *c* (merge '(vector t) *a* *b* #'<))
(type-of *c*)
==> (SIMPLE-VECTOR 8)
(defparameter *d* (make-array (length *c*) :displaced-to *c* :fill-pointer t))
(type-of *d*)
==> (VECTOR T 8)
*d*
==> #(0 1 2 3 4 5 6 7)
(array-displacement *d*)
==> #(0 1 2 3 4 5 6 7); 0
(vector-push-extend 17 *d*)
==> 8
*d*
==> #(0 1 2 3 4 5 6 7 17)
到目前为止一切顺利,对吧?
不,没那么快:
(array-displacement *d*)
==> NIL; 0
当我们调用vector-push-extend
时*d*
,它从一个置换数组转换为一个普通数组,因为底层simple-vector
无法扩展。
如果您想使用列表,您实际上可能会考虑使用列表而不是数组,merge
因为它在列表上效率更高(重用结构)。
推荐阅读
- css - 产品卡不正确
- java - 看不懂这种java参考
- scala - 如何在 Cassandra Datastax 驱动程序中将 Java 集合转换为 Scala
- mysql - 从 hive 读取数据并将其显示在仪表板上
- javascript - 如何实现需要不断运行的节点应用程序?
- python - 当我尝试访问 wand.image 时出现错误
- c# - 在 Resco SmartGrid 中选择行
- r - Finding total distance moved with for loop
- angularjs - Remove k-button class from kendogrid command buttons
- sql - SQL 使用 Union 和 Group By 将行组合成一行