使用reserveCapacity向后移动Swift填充数组

时间:2014-12-07 06:54:43

标签: arrays algorithm swift allocation

我有一个通用算法,其中大小已知的数组必须填入 reverse (从最高索引到最低索引)。如果数组没有反向填充,那么最有效的方法是调用reserveCapacity然后调用值append。换句话说,

var arr = [T]()
arr.reserveCapacity(minimumCapacity: knownCapacity)
// append values using algorithm

但是,这将在索引0处添加算法生成的第一个值。我需要它从索引knownCapacity - 1开始并向后工作。

如何在Swift中完成?当然,我可以从0开始添加值,然后反转数组,但反转是一项昂贵的操作。理想情况下,会有某种reserveBackwardsCapacityprepend方法系统,或专门为此内置到语言中构建的数据结构,但我也找不到。

我会使用[T](count: knownCapacity, repeatedValue: )并从后面填充,但因为算法是通用的(它适用于任何类型的T)我没有任何方法知道要放什么repeatedValue(并且使用仅被覆盖的值填充数组将是昂贵且不必要的)。

3 个答案:

答案 0 :(得分:1)

一个想法:不要初始化你的数组,直到第一个值即将被添加。获得第一个值后,使用knownCapacity初始化数组,将第一个值初始化为repeatedValue。然后添加其他项目,因为它们从阵列背面可用到前面。

答案 1 :(得分:0)

我不太了解Swift数组的实现,以了解性能如何与使用append构建数组相比然后反转整个数组,但您可以尝试:

arr.insert(item, atIndex: 0)

...预先添加项目。

答案 2 :(得分:0)

根据您的需要,另一种可能的解决方案是创建定义无参数初始化程序的协议,并使T类型实现它 - 这样您就可以创建T的实例:

protocol Initializable {
    init()
}

func initArray<T: Initializable>(knownCapacity: Int) -> [T] {
    var arr = [T](count: knownCapacity, repeatedValue: T())
    return arr
}

如果您使用自己的类型,只需让它们实现Initializable协议:

class MyClass : Initializable {
    required init() {
        // do something
    }
}

var array: [MyClass] = initArray(5)

如果使用现有类型,请使用扩展名实现协议 - 例如:

extension Int : Initializable{
}

let array: [Int] = initArray(10)