Apple 在其编程指南中给出了传统弹出和拉取堆栈的示例:
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
}
最佳答案
items.remove(at: 0)
或 items.removeFirst()
会更高效
比你的循环删除第一个数组元素。
但我实际上要做的是使用内部数组作为“环形缓冲区”并覆盖 一旦达到窗口大小,元素就不再移动 所有元素。像这样的事情:
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
}
关于arrays - 更改 Stack 以限制 Swift 的深度,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48187719/