2012-04-23 8 views
1

私は、グリッド形式でレイアウトされたいくつかのオブジェクトを追跡するために、2D配列で作業しようとしています。私は2次元配列の各要素にObject*を含めることを望みます。 Objectは私が定義したクラスです。しかし、これらのことに取り組むのは簡単ではありません。2Dベクトル/ダイナミックアレイ

これはObjectポインタを持つ2次元配列を埋めるための私の方法です:

int xDim; 
//how far to go in the x direction 
//x's Dimension that is 

Object *** test; //the highest level pointer used 

test = new Object ** [xDim]; 
//add horizontal array of Object ** 

for(int fillPos=0; fillPos < xDim; fillPos++){ 
    //point each Object ** to a new Object * array 
    //add column arrays 
    test[fillPos] = new Object*[zDim]; 
} 

私の意図はObjectの子クラスを指すように、この配列のObjectポインタを使用し、その後で、childObjを言います。私の意図は、この方法でそれらを使用することです。

for (int xPos=0; xPos < xDim; xPos++){ 
    for(int zPos=0; zPos < zDim; zPos++){ 
     //pointing each Object * in the 2D array to 
     //a new childObj 
     test[xPos] [zPos] = new childObj; 
    } 
} 

私はこれが潜在的にメモリの面で本当に面倒なことであることを認識しています。私はこれがこのような状況に対処する良い方法かどうか尋ねています。おそらく vector< <vector<Object*> >のようなものが良いでしょうか?ベクトルはメモリリークを避けるために削除をうまく管理しますか?または、おそらく私は単にベクトルをループして、それぞれを各Object*に呼び出してから、ベクター自体を取り除く必要がありますか?

私はベクターを持っているので、配列を使うべきですか?それぞれの方法に関連する問題は何か?

+1

スマートポインタに2Dベクトルを使用します。 – chris

+0

'ベクトル<<ベクトル>'はあまり良くありませんが、 'ベクトル<<ベクトル>'はおそらく、特にあなたの 'オブジェクト'が軽い場合はそうです。 – dasblinkenlight

+0

@dasblinkenlight配列を使用して、単一の子クラスを指すだけでなく、同じ配列内の複数の異なる子クラスを指し示したいと思います。これは、Objectクラス自体の代わりにポインタを使用する私の好みの理由です。 – Cerin

答えて

0

Object ***を使用する場合は、それぞれArray of Object Pointersを最後に削除し、最後にArray of Object**をこの順に削除する必要があります。私の意見では、これは不注意と間違いの余地がたくさん残っています。

for (int xPos=0; xPos < xDim; xPos++) { 
    for (int zPos=0; zPos < zDim; zPos++) { 
     delete test[xPos][yPos]; // delete the object ptr 
    } 
    delete[] test[xPos];   // delete each array of object ptr 
} 
delete[] test;     // delete the array of array of object ptrs 

ベクトルがローカルにスコープされているので、私はむしろ、ベクトルアプローチを好むだろう。動的割り当てはかなり高価になる可能性があるため、避けるべきです。

ベクターアプローチの場合、Object ptrsを削除するだけで済みます。 (経験則として、newを呼び出すたびに対応するdeleteを呼び出す必要があります)。

vector<vector<Object*>> matrix; 

... // some code here 

for each (vector<Object*> vec in matrix) 
    for each (Object* oPtr in vec) 
     delete oPtr; 

あなたはコンパイル時に、あなたの2次元配列のサイズを知っていた場合は、2次元配列のためのメモリ管理を避ける同じ効果を達成するため、単にオブジェクトのポインタを管理することができます。

Object * matrix[xDim][yDim]; // xDim and yDim are compile-time constants 

しかし、私はまだベクトルのような彼らは、動的配列とは異なり、自分自身のサイズを変更することができるという付加的な利点を持っているので、あなたは、サイズが先行知って心配する必要はありませんので。