许多函数式语言都有 cons
operator 。它在恒定时间内返回不可变列表或类似数组类型的结果,并在末尾 append 一个新元素。
作为伪代码示例,[1,2] : 3
将计算为 [1,2,3]
。
Swift 有 append
在摊销常数时间内向Array
添加一个元素(有一些注意事项)。但是,append
需要一个可变的Array
。我可以从不可变的数组创建一个可变的数组,然后追加,但令我感到非常惊讶的是,似乎没有现有的函数或运算符可以为我执行此操作并提供摊销恒定时间保证(如果不共享)。
最佳答案
这本身不是 cons
运算符,但您可以使用数组的 +
运算符将数组追加或添加到“”中的可变或不可变数组上构造函数样式”;使用连接结果构造一个新数组。
来自the Swift Language Guide - Collection Types :
Creating an Array by Adding Two Arrays Together
You can create a new array by adding together two existing arrays with compatible types with the addition operator (
+
). The new array’s type is inferred from the type of the two arrays you add together:...
即,
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
构造新数组没有什么不同一个后跟复制;前一步以摊余常数时间运行(由于数组空间的预分配呈指数增长),但后一步以线性时间运行。
关于arrays - Swift 中 "cons"运算符/函数/方法在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36999006/