繁体   English   中英

使用var时,Swift是否具有二次字符串连接?

[英]Does Swift have quadratic string concatenation when using var?

在Swift语言参考中,在String Mutability下,它说:

您可以通过将特定字符串分配给变量(在这种情况下可以对其进行修改)或常量(在这种情况下无法修改)来指示是否可以修改(或变异)特定字符串

我不清楚可变的“它”是变量还是

例如,如果我写:

var s = ""
for i in 0...100 {
  s += "a"
}

它类似于创建一个NSMutableString并调用appendString 100次(即线性成本)?

或者它类似于创建一系列更大的NSString实例并将它们与stringByAppendingString组合(即二次成本)?

或者它可能会在幕后创建某种绳索结构,因此它是不可变的线性的聚合?

附加到这样的集合(虽然String本身不是一个集合,你实际上是用它代码附加到它的characters视图)是线性的,而不是二次的。 Swift中的一个字符串有一个内部缓冲区,当它填满时它的大小加倍,这意味着当你重复追加时,你会看到越来越少的重新分配。 该文档描述了以这种方式附加为“摊销”的O(1)操作:大多数时候附加的是O(1),但有时它需要重新分配字符串的存储。

数组,集和词典具有相同的行为,但是如果您知道要多次追加,也可以为数组保留特定容量(使用reserveCapacity(_:) )。


所有这些集合都使用“copy-on-write”来保证值语义。 这里, xy共享一个缓冲区:

let x = "a"
let y = x

如果你改变x ,它会获得一个新的,唯一的缓冲区副本:

x += "b"
// x == "ab"
// y == "a"

之后, x有自己的缓冲区,因此后续的突变不需要复制。

x += "c"   // no copy unless buffer is full

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM