在 Swift 中,`removeLast` 方法是否会减少数组的容量?

4

我知道.append有时会增加数组的容量并形成一个新的数组副本,但是.removeLast是否会反过来减少数组的容量,并将其复制到一个更小的新数组中?

2个回答

4
没有(或者至少如果有,那么这是一个错误(*))。那将违反它的复杂性承诺。
如果您阅读append的复杂性承诺,它如下所述:
复杂度:摊销O(1)超过许多添加。如果数组使用桥接的NSArray实例作为其存储,则效率未指定。
“摊销O(1)超过许多添加”意味着对于任何给定的操作,它可能不是O(1),但随着元素数量趋近于无穷大,极限是O(1),因为会进行更大和更大的预分配,因此重新分配将变得越来越少。
现在阅读removeLast()的复杂性承诺:
复杂度:O(1)
其中没有地方可以隐藏重新分配(或者至少不能通过“复制到新的较小数组中”来实现)。
(*) 这里有一个困难的例外。数组上的任何突变都可能受到可能的写入副本的影响。这意味着任何突变,无论其性能承诺如何,都可能变为O(n),如果它与另一个数组共享存储,则共享。这使得推理Swift的性能非常具有挑战性,但并不特定于此问题。

2
正如Rob Napier的回答指出的那样,removeFirst不应该减少数组的容量。补充一些细节,removeLast也不会减少容量,而removeAll默认情况下会减少容量,但它可以通过参数keepingCapacity来改变这种行为。
var arr = [Int]()
print(arr.capacity)    // 0
arr.append(1)
print(arr.capacity)    // 2
arr.append(2)
print(arr.capacity)    // 2
arr.removeFirst()
print(arr.capacity)    // 2
arr.removeLast()
print(arr.capacity)    // 2 (though the array is now empty)
arr.removeAll(keepingCapacity: true)
print(arr.capacity)    // 2
arr.removeAll()
print(arr.capacity)    // 0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接