[英]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”來保證值語義。 這里, x
和y
共享一個緩沖區:
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.