文書   >   Swift   >   Array   >   reserveCapacity(_:)
インスタンスメソッド
reserveCapacity(_:)
指定された数の要素を格納するのに十分なスペースを確保します。
宣言
パラメータ
minimumCapacity | 格納するために要求された要素の数。 |
議論
既知の数の要素を配列に追加する場合は、このメソッドを使用して複数の再割り当てを避けます。このメソッドは、配列が、要求された数の要素に少なくとも割り当てられたスペースを持つ、一意の、可変の、連続した記憶領域を持つことを保証します。
ブリッジされた記憶領域を持つ配列で reserveCapacity(_:) メソッドを呼び出すと、既存の記憶領域に minimumCapacity 要素を格納するスペースがある場合でも、連続した記憶領域へのコピーをトリガーされます。
パフォーマンス上の理由から、新しく割り当てられた記憶領域のサイズは、要求された容量よりも大きくなる可能性があります。新しい記憶領域のサイズを決定するには、配列の capacity プロパティを使用して下さい。
配列の幾何学的成長戦略を維持
動的に成長する配列を基にしたカスタムデータ構造を実装する場合、reserveCapacity(_:) メソッドを無邪気に呼び出すと、予想よりもパフォーマンスが低下する可能性があります。配列は、償却された一定時間パフォーマンスを達成するために要素を付け加えるための幾何学的割り当てパターンに従う必要があります。Array 型の append(_:) および append(contentsOf:) メソッドがあなたの代わりにこの詳細を処理しますが、 reserveCapacity(_:) は指定しただけの大きさのスペースを割り当て(丸め値にパディングされ)、それ以上はできません。これにより、過剰割り当ては回避されますが、一定時間パフォーマンスが償却されないように挿入される可能性があります。
以下のコードでは、values、整数の配列、および addTenQuadratic() 関数を宣言しており、この関数は、呼び出しごとにさらに 10 個の値を values 配列に追加します。
var values: [Int] = [0, 1, 2, 3]
// Don't use 'reserveCapacity(_:)' like this
func addTenQuadratic() {
let newCount = values.count + 10
values.reserveCapacity(newCount)
for n in values.count..<newCount {
values.append(n)
}
}
reserveCapacity(_:) を呼び出すと、addTenQuadratic() を通過するたびに values 配列の容量がちょうど 10 要素ずつ増加します。これは直線的な増加です。多数の呼び出しにわたって平均したときに一定の時間がある代わりに、この関数は values.count で線形のパフォーマンスに低下する可能性があります。これはほぼ間違いなくあなたが望むものではありません。
このような場合、最も簡単な解決策は、単に reserveCapacity(_:) への呼び出しを削除し、append(_:) メソッドで配列を大きくすることです。
func addTen() { let newCount = values.count + 10 for n in values.count..<newCount { values.append(n) } }
配列の容量をもっと細かく制御する必要がある場合は、計算したサイズを reserveCapacity(_:) に渡して、独自の幾何学的成長戦略を実装して下さい。
複雑さ:O(n)、ここで n は配列内の要素数です。
関連
プロトコルから
RangeReplaceableCollection
以下も見よ
要素の追加
配列の末尾に新しい要素を付け加えます。
指定された位置に新しい要素を挿入します。
func insert<C>(contentsOf: C, at: Int)
シーケンスの要素をコレクションの指定された位置に挿入します。
func replaceSubrange<C>(Range<Int>, with: C)
要素の範囲を指定したコレクション内の要素で置き換えます。
func replaceSubrange<C, R>(R, with: C)
指定された要素の部分範囲を与えられたコレクションで置き換えます。
トップへ
トップへ
トップへ
トップへ
トップへ