"附加"到ArraySlice?

时间:2017-07-12 14:16:20

标签: swift

说......

  • 你有大约20件事
  • 经常,你做一个复杂的计算,运行1000个项目的循环。最终结果是每次大约20个不等的数字
  • 在你完成整个循环之前,你不知道会有多少人
  • 然后你想快速(当然优雅!)访问许多地方的结果集
  • 出于性能原因,您不希望每次只创建一个新阵列。请注意,不幸的是,数量不同,因此您无法轻易地重复使用相同的数组。

怎么样......

var thingsBacking = [Thing](repeating: Thing(), count: 100) // hard limit!
var things: ArraySlice<Thing> = []

func fatCalculation() {

    var pin: Int = 0
    // happily, no need to clean-out thingsBacking
    for c in .. some huge loop {

        ... only some of the items (roughly 20 say) become the result
        x = .. one of the result items

        thingsBacking[pin] = Thing(... x, y, z )
        pin += 1
    }

    // and then, magic of slices ...
    things = thingsBacking[0..<pin]

(然后,您可以在任何地方执行此操作...... for t in things { .. }

我想知道的是,有没有办法可以通过一个步骤拨打ArraySlice<Thing>来执行此操作 - &#34;追加到&#34;一个ArraySlice并且避免在最后设置长度?

所以,像这样......

things = ... set it to zero length
things.quasiAppend(x)
things.quasiAppend(x2)
things.quasiAppend(x3)

如果没有进一步努力,things现在的长度为3,实际上这三个项目已经在支持数组中。

我对这里的表现特别感兴趣(异常!)

另一种方法,

var thingsBacking = [Thing?](repeating: Thing(), count: 100) // hard limit!

然后将数据后面的第一个设置为nil作为结束标记。同样,你不必浪费时间归零。但结束标记是令人讨厌的。

有没有更好的方法来解决这种特殊类型的阵列性能问题?

1 个答案:

答案 0 :(得分:1)

根据MartinR的评论,似乎问题出现了

  • 数据点已传入
  • 你不知道在最后一次之前会有多少(总是小于限制)和
  • 你必须以高Hz重做整个事情

似乎最好只是:

(1)设置数组

var ra = [Thing](repeating: Thing(), count: 100) // hard limit!

(2)在每次运行开始时,

 .removeAll(keepingCapacity: true)

(3)继续前进.append每个人。

(4)一旦完成,你不必特别标记结束或设定长度。

它似乎确实会使用相同的阵列支持。它当然会“增加长度”,就像每次你追加一样 - 你可以随时愉快地迭代。

切片 - 迷路了!