有效地连接字符串数组
efficiently concatenate array of strings
OCaml标准库提供函数String.concat
https://caml.inria.fr/pub/docs/manual-ocaml/libref/String.html
val concat : string -> string list -> string
String.concat sep sl
concatenates the list of strings sl
, inserting the separator string
sep
between each.
推测此函数的存在是为了更容易将多个字符串连接在一起 time/space 与字符串长度成线性关系。
数组是否存在类似的功能?特别是,有没有一种方法可以有效地将字符串数组连接在一起,而无需 1) 编写 C 扩展并构建棘手的中间结构或
2) 有效调用 String.concat "" (Array.to_list arr))
.
我确信有更有效的方法,例如 unsafe_blit 方法 String.concat
使用,但简单的折叠至少是对选项 2 的改进:
Array.fold_left (fun acc s -> acc ^ s) "" arr
最好是自己写concat
函数模仿String.concat
。如果你想要更短的东西,使用缓冲区来累积你的结果(Array.iter (Buffer.add_string b) arr
)——不要重复连接,这会产生太多的分配。
OCaml标准库提供函数String.concat
https://caml.inria.fr/pub/docs/manual-ocaml/libref/String.html
val concat : string -> string list -> string
String.concat sep sl
concatenates the list of stringssl
, inserting the separator stringsep
between each.
推测此函数的存在是为了更容易将多个字符串连接在一起 time/space 与字符串长度成线性关系。
数组是否存在类似的功能?特别是,有没有一种方法可以有效地将字符串数组连接在一起,而无需 1) 编写 C 扩展并构建棘手的中间结构或
2) 有效调用 String.concat "" (Array.to_list arr))
.
我确信有更有效的方法,例如 unsafe_blit 方法 String.concat
使用,但简单的折叠至少是对选项 2 的改进:
Array.fold_left (fun acc s -> acc ^ s) "" arr
最好是自己写concat
函数模仿String.concat
。如果你想要更短的东西,使用缓冲区来累积你的结果(Array.iter (Buffer.add_string b) arr
)——不要重复连接,这会产生太多的分配。