Swift中的“cons”运算符/函数/方法在哪里?

时间:2016-05-03 08:17:05

标签: arrays swift append cons

许多函数式语言都有cons operator。它返回不可变列表或类型数组的结果,并在常量时间内将新元素附加到结尾。

作为伪代码示例,[1,2] : 3将评估为[1,2,3]

Swift有append在分摊的常量时间内向Array添加元素(有一些警告)。但是,append需要一个可变的Array。我可以从一个不可变的Array创建一个可变append,但是我很惊讶似乎没有现有的函数或运算符为我这样做并提供了分摊的常量时间保证(不共享的地方)。

1 个答案:

答案 0 :(得分:4)

这本身不是cons运算符,但您可以使用+运算符将数组附加或预先添加到#34;构造函数样式中的可变或不可变数组&# 34 ;;使用连接结果构造一个新数组。

来自the Swift Language Guide - Collection Types

  

通过一起添加两个数组来创建数组

     

您可以通过将两个现有数组加在一起来创建新数组   兼容类型与加法运算符(+)。新阵列的   type是从你加在一起的两个数组的类型推断出来的:

     

...

即,

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在现有可变的上构建 new 数组不同复制;前一步以摊销的常数时间运行(由于数组空间的预分配呈指数增长),但后者以线性时间运行。