我刚刚想到在使用Swift中的子序列时,
func suffix(from: Int)
似乎只与dropFirst(_:)
相同(显然,您只需将输入值从" 3"更改为" 7"在这种情况下长度数组" 10"。)
重复一遍。所以:当然,对于一组说长度为十的人。我的意思是func suffix(from: Int)
与" 2"与dropFirst(_:)
相同,例如" 8" 。
同样,upTo
/ through
似乎与dropLast(_:)
除了方便之外还有什么区别?
(也许是在错误条件,性能或?)
我想知道,事实上,在一个或另一个内部是通过调用另一个来实现的吗?
答案 0 :(得分:7)
他们完全不同。
Collection
协议定义。Subsequence
返回Index
。Sequence
协议定义。SubSequence
。 *与所有协议要求记录的时间复杂性一样,符合类型的实现可能具有较低的时间复杂度。例如,RandomAccessCollection
的dropFirst(_:)
方法将在O(1)时间内运行。
然而,当谈到Array
时,这些方法发生以表现相同(除了处理超出范围的输入)。
这是因为Array
的{{1}}类型Index
从Int
开始,并按顺序计数到0
,因此意味着一个子序列删除的第一个array.count - 1
元素是从索引n
开始的相同子序列。
同样因为n
是Array
,两种方法都会在O(1)时间内运行。
答案 1 :(得分:2)
你是对的,他们是连接的,但是,是的,这是有区别的。来自文档:
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 "[]"
在第一个示例中,后缀(2)仅返回最后两个两个元素,而dropFirst(2)返回除第一个两个元素之外的所有元素。同样,他们的行为也不同。比序列长的参数很长。 (此外,后缀仅适用于有限序列。)
同样使用prefix和dropLast。另一种思考方式,对于长度为n的序列,前缀(k)== dropLast(n-k),其中k <= n。
答案 2 :(得分:2)
最大差异IMO是dropFirst()
不会将您的代码暴露给超出范围的索引错误。因此,您可以安全地在空数组上使用dropFirst
形式,而prefix
/ suffix
方法可能会在空数组或超出范围的参数上崩溃。
所以dropFirst()
FTW,如果您指定的元素多于可用的元素而不是崩溃,或者您不想要/需要检查以确保您使用的索引小于array.count
等
从概念上讲,我认为这对于命名的操作是有意义的,因为first
是一个可选类型的属性,它返回第一个元素(如果它存在)。说dropFirst(3)
表示&#34;删除可能存在的第一个元素(如果存在),并且这样做三次&#34;