我想通过创建自定义集合来了解有关Swift's Collection Types的更多信息。
问题在于我找不到任何不仅使用内部数组/字典的“自定义”集合类型的示例。
这些对我没有帮助,因为当需要符合收集协议时,这些示例只会将所需的方法传播到军队/字典。
也就是说,在查看维基百科的List of Data Structures之后,我发现任何不符合集合类型的性能特征的东西,不仅仅是专门的数组。
有没有人知道可以使用自定义集合类型实现的数据结构,而不使用内部集合类型?
修改
集合协议一致性要求访问startIndex,endIndex和集合元素的时间是恒定的 - O(1)。
编辑2
评论中的共识似乎是LinkedList是满足这些特征的数据结构。我的LinkedList定义如下:
indirect enum LinkedList<T> {
case value(element: T, next: LinkedList<T>)
case end
}
extension LinkedList: Sequence {
func makeIterator() -> LinkedListIterator<T> {
return LinkedListIterator(current: self)
}
}
struct LinkedListIterator<T>: IteratorProtocol {
var current: LinkedList<T>
mutating func next() -> T? {
switch current {
case let .value(element, next):
current = next
return element
case .end:
return nil
}
}
}
我仍然不明白,subscript
如何在不变的时间内返回。对于LinkedList:
let data = LinkedList<Int>.value(element: 0, next: LinkedList<Int>.value(element: 1, next: LinkedList<Int>.value(element: 2, next: LinkedList<Int>.value(element: 3, next: LinkedList<Int>.end))))
假设我想要访问Collection中的第3个元素:
let example = data[2]
目前,这就是我实施下标的方式:
subscript (position: Index) -> Element {
precondition(position < endIndex && position >= startIndex)
var iterator = makeIterator()
for i in 0 ..< position {
iterator.next()
if i + 1 == position {
return iterator.next()!
}
}
var zero = makeIterator()
return zero.next()!
}
因为方法的完成时间取决于`i,所以它以线性而不是恒定的时间结束。如何实施这种恒定时间方法?