私は時には自分のニーズに合わせて拡大する必要があるダイナミックな正方形の2D配列で作業しています。拡大部分はこのように、配列の各境界に新しいケースを追加することで構成されています動的な2D配列の中央をより小さなもので埋めるにはどうすればよいですか?
これを実現するために、私は最初の一時的な他の2次元配列で私の実際の2D配列の内容をコピーします同じサイズ。次に、新しい2D配列を作成し、新しい配列の元の内容をコピーします。
新しいアレイの途中で古いアレイの内容を簡単にコピーする方法はありますか?私がこれまでに発見した唯一の方法は、唯一のセクションのための2つを使用することです:
for(int i = 1; i < arraySize-1; i++)
{
for(int j = 1; j < arraySize-1; j++)
{
array[i][j] = oldArray[i-1][j-1];
}
}
しかし、これを達成するために何の迅速な方法が存在しない場合、私は思ったんだけど。私はstd :: fillの使用について考えましたが、この特定の場合にどのように使用できるかはわかりません。
マイEnlargeArray機能:
template< typename T >
void MyClass<T>::EnlargeArray()
{
const int oldArraySize = tabSize;
// Create temporary array
T** oldArray = new T*[oldArraySize];
for(int i = 0; i < oldArraySize; i++)
{
oldArray[i] = new T[oldArraySize];
}
// Copy old array content in the temporary array
for(int i = 0; i < arraySize; i++)
{
for(int j = 0; j < arraySize; j++)
{
oldArray[i][j] = array[i][j];
}
}
tabSize+=2;
const int newArraySize = arraySize;
// Enlarge the array
array= new T*[newArraySize];
for(int i = 0; i < newArraySize; i++)
{
array[i] = new T[newArraySize] {0};
}
// Copy of the old array in the center of the new array
for(int i = 1; i < arraySize-1; i++)
{
for(int j = 1; j < arraySize-1; j++)
{
array[i][j] = oldArray[i-1][j-1];
}
}
for(int i = 0; i < oldArraySize; i++)
{
delete [] oldArray[i];
}
delete [] oldArray;
}
あなたはtmpアレイにコピーして、新しいアレイにコピーします。より大きな配列にコピーしてポインターを入れ替えることが簡単にできます。 –
Btw、あなたは既存の配列を拡大する前に*メモリを解放しないでください。そうすればメモリリークが発生します。 –
内部ループのデータはシーケンシャルなので、memcpy(array [i] [1]、oldArray [i-1] [0]、sizeof(T)*(arrysize - 2)) ' –