没有内部集合类型的自定义集合?

时间:2017-07-28 12:37:23

标签: swift data-structures collections

我想通过创建自定义集合来了解有关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,所以它以线性而不是恒定的时间结束。如何实施这种恒定时间方法?

0 个答案:

没有答案