我知道.append有时会增加一个数组的容量并形成一个新的数组副本,但是.removeLast会反过来这个并通过复制到一个新的更小的数组来减少数组的容量吗? 不(或者至少如果是,则是错误(*)).这
如果您阅读附加的复杂性承诺,它会显示:
Complexity: Amortized O(1) over many additions. If the array uses a bridged NSArray instance as its storage, the efficiency is unspecified.
“通过多次添加分摊O(1)”意味着对于任何给定的操作,它可能不是O(1),但是元素数量朝向无穷大的限制是O(1),因为越来越大的预分配将是制作,所以重新分配将变得越来越少.
现在阅读removeLast()的复杂性承诺:
Complexity: O(1)
没有重新分配隐藏在那里(或者至少它无法实现“通过复制到一个新的较小的数组”).
(*)这是一个很难的例外.阵列上的任何突变都可能存在写入时的拷贝.这意味着任何突变,无论其性能承诺如何,如果与另一个阵列共享存储,则可能变为O(n).这使得关于Swift性能的推理非常具有挑战性,但并不是特定于这个问题.