`removeLast`会不会减少swift中数组的容量?

时间:2016-12-06 20:43:18

标签: arrays swift

我知道.append偶尔会增加数组的容量并形成数组的新副本,但.removeLast会反过来并通过复制到新的数据来减少数组的容量小阵列?

2 个答案:

答案 0 :(得分:4)

否(或者至少如果是,则是错误(*))。这将违反其复杂性承诺。

如果您阅读append的复杂性承诺,则会显示:

  

复杂性:通过多次添加分摊O(1)。如果数组使用桥接的NSArray实例作为其存储,则效率未指定。

“通过多次添加分摊O(1)”意味着对于任何给定的操作,它可能不是O(1),但是元素数量朝向无穷大的极限是O(1),因为更大和更大的预先将进行分配,因此重新分配将变得越来越少。

现在阅读removeLast()的复杂性承诺:

  

复杂性:O(1)

重新分配无处可隐藏(或者至少无法通过复制到新的较小数组来实现)。

(*)这是一个很难的例外。阵列上的任何突变都可能存在写入时的拷贝。这意味着任何突变,无论其性能承诺如何,如果与另一个阵列共享存储,可能会变为O(n)。这使得关于Swift性能的推理非常具有挑战性,但并不是特定于这个问题。

答案 1 :(得分: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