8

我有一个ch要附加到字符串的字符str。我意识到你可以像这样连接字符串:

(setf str (concatenate 'string str (list ch)))

但这似乎效率很低。有没有更快的方法来附加一个字符?

4

2 回答 2

12

如果字符串有填充指针并且可能也是可调整的。

Adjustable = 可以改变它的大小。

fill-pointer = 内容大小,长度,可以小于字符串大小。

VECTOR-PUSH= 在末尾添加一个元素并增加填充指针。

VECTOR-PUSH-EXTEND= as VECTOR-PUSH,如果数组太小,还会另外调整数组的大小。

我们可以用普通的弦来制作可调节的弦:

CL-USER 32 > (defun make-adjustable-string (s)
               (make-array (length s)
                           :fill-pointer (length s)
                           :adjustable t
                           :initial-contents s
                           :element-type (array-element-type s)))
MAKE-ADJUSTABLE-STRING

CL-USER 33 > (let ((s (make-adjustable-string "Lisp")))
               (vector-push-extend #\! s)
               s)
"Lisp!"
于 2013-08-04T18:52:08.840 回答
8

如果您想多次扩展单个字符串,通常使用 with-output-to-string 非常高效,写入它提供的流。请务必使用 write 或 princ 等(而不是 format)来提高性能。

于 2013-08-04T20:48:48.417 回答