将Stack更改为Swift中的深度有限

时间:2018-01-10 12:41:13

标签: arrays swift

Apple在其编程指南中给出了一个传统的pop和pull stack的例子:

struct Stack<Element> {
    var items = [Element]()
    mutating func push(_ item: Element) {
        items.append(item)
    }
    mutating func pop() -> Element {
        return items.removeLast()
    }
}

我的目的是创建一个结构,从中计算内容的“移动平均值”,同时在我的代码中添加额外的值 - 对我添加到堆栈中的最后10个项目进行平均。

可以修改以上内容,或者我最好使用类似下面的新结构:

struct Avg<Element> {
    var items = [Element]()
    mutating func additem(_item: Element) {
       if items.count<10 {
           items.append(item)
       } else {
           for i in (1...10).reversed() {
               items[i] = items[i-1]
           }
           items[0]=item
       }
   }
// more functions
}

1 个答案:

答案 0 :(得分:4)

items.remove(at: 0)items.removeFirst()会更有效率 比你的循环删除第一个数组元素。

但我实际上要做的是将内部数组用作&#34;环形缓冲区&#34;并覆盖 达到窗口大小后的元素,而不是移动 所有元素。像这样:

struct Avg<Element> {
    let windowSize: Int
    var totalCount: Int
    var items: [Element]

    init(windowSize: Int) {
        self.windowSize = windowSize
        self.totalCount = 0
        self.items = []
    }

    mutating func additem(_ newItem: Element) {
        if items.count < windowSize {
            items.append(newItem)
        } else {
            items[totalCount % windowSize] = newItem
        }
        totalCount += 1
    }

    // more functions
}