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
}
答案 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
}