suffix(from:) 和 dropFirst(_:) 之间有什么区别吗?

Is there any difference at all between suffix(from:) and dropFirst(_:)?

我刚刚想到,在 Swift、

中处理子序列时

func suffix(from: Int) 似乎与 dropFirst(_:) 相同(显然,在长度为“10”的数组的情况下,您只需将输入值从“3”更改为“7” .)

重复一遍。所以:当然,对于长度为 十的数组。我的意思是 func suffix(from: Int) 与“2”将与 dropFirst(_:) 与“8” 相同。

同样 upTo / through 似乎与 dropLast(_:)

相同

除了方便有什么区别吗

(可能是在错误条件下,性能上,还是?)

我在想,实际上 Swift 中的一个或另一个是否只是通过调用另一个来实现的?

你是对的,他们是有联系的,但是是有区别的。来自文档:

let numbers = [1, 2, 3, 4, 5]
print(numbers.suffix(2))
// Prints "[4, 5]"
print(numbers.suffix(10))
// Prints "[1, 2, 3, 4, 5]"

对比

let numbers = [1, 2, 3, 4, 5]
print(numbers.dropFirst(2))
// Prints "[3, 4, 5]"
print(numbers.dropFirst(10))
// Prints "[]"

第一个例子中,suffix(2)returns只有最后两个元素,而dropFirst(2)returns除了第一个 两个元素之外的所有元素。同样,他们的行为也不同。比序列长的参数很长。 (此外,后缀仅适用于有限序列。)

与 prefix 和 dropLast 一样。另一种思考方式,对于长度为 n 的序列,prefix(k) == dropLast(n-k),其中 k <= n.

IMO 最大的区别是 dropFirst() 不会将您的代码暴露给超出范围的索引错误。因此,您可以安全地在空数组上使用任何一种形式的 dropFirst,而 prefix / suffix 方法可能会在空数组或参数超出范围时崩溃。

所以 dropFirst() 如果您在指定的元素多于可用元素而不是崩溃时更喜欢空数组结果,或者如果您不想/不需要检查以确保您的您将使用的索引小于 array.count,等等

从概念上讲,我认为这对于命名的操作是有意义的,考虑到 first 是一个可选类型 属性 而 returns 第一个元素 if它存在。说 dropFirst(3) 意味着 "remove the maybe-present first element if it exists, and do so three times"

它们完全不同。

*与所有协议要求记录的时间复杂度一样,符合类型的实现可能具有较低的时间复杂度。例如,RandomAccessCollectiondropFirst(_:) 方法将在 O(1) 时间内 运行。


但是,当涉及到 Array 时,这些方法 碰巧 表现相同(除了处理超出范围的输入)。

这是因为 Array 有一个类型为 IntIndex,它从 0 开始依次计数到 array.count - 1,因此意味着删除前 n 个元素的子序列与从索引 n.

开始的子序列 相同

另外因为Array是一个RandomAccessCollection,这两种方法都将在O(1)时间内运行。