当前位置: 首页 > 面试题库 >

Swift array.capacity与array.count

麻学博
2023-03-14
问题内容

我了解array.count(数组中元素的数量)。 count对迭代数组的elements很有用 。我有点理解array.capacity的要点

容量
一个整数值,表示在不重新分配的情况下阵列可以存储多少个元素(只读)。

实验

我一直在操场上玩,发现数组的容量是偶数(增加2)

var arr = [1, 2, 3 , 4, 5, 6, 7]
arr.removeLast() // capacity stays the same after a removal
println(arr.capacity) // 8
println(arr.count)    // 6

var arr = [1, 2, 3 , 4, 5, 6]
arr.removeLast()
println(arr.capacity) // 6
println(arr.count)    // 5

问题

阵列容量有什么用?请举一个具体的例子吗?


问题答案:

阵列的容量(尤其是其reserveCapacity方法)可让您在阵列中预分配空间。

如果要向数组中添加元素,并且超出其容量,则该数组必须增加其容量。由于Swift数组将其元素连续存储在内存中,因此它必须重新分配其内部存储,并且(通常)将其所有元素从旧存储复制到新存储。(请注意,NSArray没有文献证明它可以连续存储其元素,但是我们可以根据withUnsafeMutableBufferPointer方法的存在来推断Swift
Array可以这样做。)

如果您 事先
知道要向阵列中添加多少个元素,则可以使用该reserveCapacity方法来预设阵列的容量,这样它就不需要执行任何重新分配(和关联的复制)。

我想问一个数组的能力的唯一原因是要学习系统的工作原理并调试性能问题。

通常,您无需担心保留容量。重新分配很少是性能问题。Swift使用(我相信)有效的重新分配计划,以便重新分配的数量在数组的最终计数中为对数。例如,如果一次添加一百万个元素,Swift最多应执行20-30个重新分配。

但是,如果您知道阵列将非常大(例如Mac上为千兆字节或iOS设备上为数十兆字节),或者您是否在性能敏感的代码路径中填充阵列(例如,填充将开始的音频缓冲区)在几秒钟内播放),您可能希望保留容量并避免重新分配。

除非您知道重新分配是一个问题,否则您可能不必担心保留容量,这是因为探查器显示它们是瓶颈,或者是因为您有其他证据(例如音频缓冲区示例中的音频故障)。



 类似资料:
  • 在C语言中,假设每个算法被赋予完全相同的一组进程,那么先到先得、最短作业优先和循环之间的周转时间是否相等?还是调度算法不同?

  • 问题内容: 为了为 HTML5 Doctype 定义字符集,我应该使用哪种表示法? 短: 长: 问题答案: 在HTML5中,它们是等效的。使用较短的一个,更容易记住和键入。浏览器支持很好,因为它是为向后兼容而设计的。

  • 连接的多个输入都相当于Yes的时候才会输出Yes。 用法 Your browser does not support the video tag. 案例:小闹钟 功能:今天15:10:00,响起猫叫声小闹钟 工作原理 当所有的输入都是Yes的时候,与节点才输出Yes。

  • 问题内容: 似乎有三种 相同的 方法可以独立于平台获取依赖于平台的“文件分隔符”: 我们如何决定何时使用哪个? 它们之间甚至有什么区别吗? 问题答案: 可以通过调用命令行参数或使用命令行参数覆盖 获取默认文件系统的分隔符。 获取默认文件系统。 获取文件系统的分隔符。请注意,作为一种实例方法,在需要代码在一个JVM中对多个文件系统进行操作的情况下,可以使用该方法将不同的文件系统传递给代码(而不是默认

  • 问题内容: 我今天刚刚与一些同事讨论了python的db-api fetchone vs fetchmany vs fetchall。 我确定每个应用程序的用例都取决于我正在使用的db-api的实现,但是总的来说,fetchone,fetchmany,fetchall的用例是什么? 换句话说,以下等效项是什么?还是其中之一比其他人更受青睐?如果是这样,在哪些情况下? 问题答案: 我认为这确实取决于