データ構造全体を連続したメモリ ブロックに収めることができると仮定すると、一度に割り当てを行ってから、インデックス作成を引き継ぐことができます。
注: データを 1 つの連続したメモリ ブロックに収めることができない場合でも、複数の大きなブロックを割り当ててそれらをつなぎ合わせることで、この手法を使用できます。
colIndex
まず、各行の最初の列のインデックスを含むヘルパー配列 を形成します。の長さを に設定colIndex
しRowCount+1
ます。colIndex[0] := 0
これを設定してから構築しますcolIndex[i+1] := colIndex[i] + ColCount[i]
。まで実行される for ループでこれを行いますRowCount
。したがって、最後のエントリ にはcolIndex[RowCount]
、要素の総数を格納します。
a の長さを に設定しますcolIndex[RowCount]
。これには少し時間がかかる場合がありますが、以前に行っていた作業よりも速くなります。
ここで、いくつかのインデクサーを作成する必要があります。それらをクラスまたはレコードに入れます。
ゲッターは次のようになります。
function GetItem(row, col: Integer): Word;
begin
Result := a[colIndex[row]+col];
end;
セッターは明らかです。これらのアクセス方法をインライン化して、パフォーマンスを向上させることができます。オブジェクトのクライアントに便利なように、それらをインデックス付きプロパティとして公開します。
と の有効性をチェックするコードを追加する必要がrow
ありcol
ます。colIndex
後者に使用する必要があります。{$IFOPT R+}
ネイティブ インデックス作成の範囲チェックを模倣する場合は、このチェックをオプションにすることができます。
もちろん、最初のインスタンス化後に列数のいずれかを変更したい場合、これはまったく問題ありません。