许多函数语言都有一个cons operator。它返回一个不可变的列表或类似数组的类型的结果,并在常量时间内将一个新元素附加到末尾。
作为一个伪代码示例,[1,2] : 3将计算为[1,2,3]
Swift有append来添加一个元素到摊销常数时间内的Array中(有一些警告)。但是,append需要可变的。我可以从一个不变的变量创建一个可变的变量,然后再创建一个可变的变量,但我很惊讶的是,似乎没有一个现有的函数或运算符可以为我这样做,并提供摊销的恒定时间保证(如果没有共享)。

最佳答案

这本身不是cons运算符,但您可以使用数组的+运算符在“构造函数样式”中向可变或不可变数组追加或预处理数组;使用连接的结果构造新数组。
the Swift Language Guide - Collection Types开始:
通过将两个数组添加到一起创建数组
通过将两个现有数组添加到一起,可以创建一个新数组
与加法运算符兼容的类型(+)。新阵列的
类型是根据您添加到一起的两个数组的类型推断的:

即。,

let foo = [1, 2]
let bar = foo + [3]    // [1, 2, 3], "cons(foo, 3)"
let baz = [-1, 0] + bar // [-1, 0, 1, 2, 3], "cons([-1, 0], bar)"

但是,请注意,这不会在摊销常量时间内运行,因为我们需要分配新的内存并将结果复制到这个内存中。但是,由于数组是Swift中的值类型,所以我看不出对不可变数组执行的任何操作(例如,我们创建了一个新的不可变数组)将如何在恒定时间内运行,因为我们总是需要为此进行复制(即使有时这可能会被延迟执行)。
因此,上述性能不应与在现有可变阵列上使用.append>/.appendContentsOf然后复制构建新阵列的性能不同;前者在摊余恒定时间内运行(由于阵列空间的预分配呈指数增长),后者在线性时间内运行。我。

10-07 13:28
查看更多