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"
它们完全不同。
-
- 由
Collection
协议定义。
- Returns一个
Subsequence
from a given starting Index
.
- 记录的时间复杂度为 O(1)(您可以 see its default implementation here)。
- 如果您传递的索引超出范围,则会出现运行时错误。
-
- 由
Sequence
协议定义。
- Returns 具有给定最大 元素数 的
SubSequence
从序列的头部删除。
- 记录的时间复杂度为 O(n)*。尽管 its default implementation 实际上具有 O(1) 的时间复杂度,但这只是将 O(n) 遍历丢弃的元素推迟到迭代。
- Returns 如果您输入的数字大于序列的长度,则为空子序列。
*与所有协议要求记录的时间复杂度一样,符合类型的实现可能具有较低的时间复杂度。例如,RandomAccessCollection
的 dropFirst(_:)
方法将在 O(1) 时间内 运行。
但是,当涉及到 Array
时,这些方法 碰巧 表现相同(除了处理超出范围的输入)。
这是因为 Array
有一个类型为 Int
的 Index
,它从 0
开始依次计数到 array.count - 1
,因此意味着删除前 n
个元素的子序列与从索引 n
.
开始的子序列 相同
另外因为Array
是一个RandomAccessCollection
,这两种方法都将在O(1)时间内运行。
我刚刚想到,在 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"
它们完全不同。
-
- 由
Collection
协议定义。 - Returns一个
Subsequence
from a given startingIndex
. - 记录的时间复杂度为 O(1)(您可以 see its default implementation here)。
- 如果您传递的索引超出范围,则会出现运行时错误。
- 由
-
- 由
Sequence
协议定义。 - Returns 具有给定最大 元素数 的
SubSequence
从序列的头部删除。 - 记录的时间复杂度为 O(n)*。尽管 its default implementation 实际上具有 O(1) 的时间复杂度,但这只是将 O(n) 遍历丢弃的元素推迟到迭代。
- Returns 如果您输入的数字大于序列的长度,则为空子序列。
- 由
*与所有协议要求记录的时间复杂度一样,符合类型的实现可能具有较低的时间复杂度。例如,RandomAccessCollection
的 dropFirst(_:)
方法将在 O(1) 时间内 运行。
但是,当涉及到 Array
时,这些方法 碰巧 表现相同(除了处理超出范围的输入)。
这是因为 Array
有一个类型为 Int
的 Index
,它从 0
开始依次计数到 array.count - 1
,因此意味着删除前 n
个元素的子序列与从索引 n
.
另外因为Array
是一个RandomAccessCollection
,这两种方法都将在O(1)时间内运行。