2016-03-24 11 views
-1

実行時に動的に配列を割り当てるというアイデアを抱いて、私は現時点で苦労しています。 Javaからは、クラススケルトンの配列を宣言するだけで、実装のサイズだけが必要でした。クラス内にオブジェクトポインタの2D配列を動的に割り当てる

これは私が動的に2次元配列を割り当てるために見つけたものです:

Grid.h 
Block** grid; 

Grid.cpp 
grid = new Block*[size] 
for(int i = 0 ; i < size ; i++) 
    grid[i] = new Block[size] 

私は常にオブジェクトへのポインタを使用してではなく、オブジェクト自体を格納することを言われてきたオブジェクトを扱うが、これは、かなりいい作品パフォーマンスがはるかに優れています。私はこのような配列のポインタの第2次元を作成しようとしたときにそう:

error: assigning to 'Block *' from incompatible type 'Block **'; dereference with * 
     grid[i] = new Block* [size]; 
       ^~~~~~~~~~~~~~~~~~ 
        * 

C++の方法に若干の新しいビーイング:私はこれに私のコードを変更し

Grid.cpp 
grid = new Block*[size] 
    for(int i = 0 ; i < size ; i++) 
     grid[i] = new Block*[size]; 

は、私はエラーを得ました誰かが私が間違っていることを教えてもらえますか?あるいは、私が間違ったことを完全にやろうとしていても?

ありがとうございます!

+1

'new T 'は' T * '型です。したがって、 'new Block *'は 'Block **'型を持ちます。 'grid'は' Block ** '型で' grid [i] 'は' Block * '型です。 2つは同じではありません。ところで、なぜ 'std :: vector >'ではないのですか? –

+0

ああ、 'new'キーワードでオブジェクトを作成すると、オブジェクトへのポインタがデフォルトで返されますか? これらの動的に割り当てられた配列は、オブジェクトの2Dベクトルを作成するよりも高速で効率的です。また、デコンストラクタで手動クリーンアップを行う必要がありますか? – nickcorin

+0

"オブジェクトへのポインタがデフォルトで返されますか?" - どうやって**他の** **あなたはおそらく**動的割り当てを行うことができますか? 「これらの動的に割り当てられた配列は、オブジェクトの2Dベクトルを作成するよりも高速かつ効率的です」と言われています。 (BSが...まったく、絶望的に間違っていたと言った人は誰でも)一般的な真実ではありません。 –

答えて

0

動的2次元配列は、配列へのポインタの配列です。 最初にポインタの配列を初期化し、次に他の配列をループを使用して初期化する必要があります。

ここで、配列は[をrowCount] [COLCOUNT]作成INT使用例:

int** array = new int*[rowCount]; 
for(int i = 0; i < rowCount; ++i) 
    array[i] = new int[colCount]; 

そうでない場合はもちろん、あなたがいつも使って、スタック上の2次元配列を持つことができます。

int array[rowCount][colCount]; 
+0

ありがとうございます。私は、例えばint型の標準配列ではなく、型へのポインタとして配列を作成する方法を尋ねていました。私は最近、 'new'キーワードがポインタを作成して返してくれると言われました。 – nickcorin

+1

'int配列[rowCount] [colCount];' VLAは標準のC++ではありません。 –

+0

だから、実際にはstd :: vectorやstd :: arrayを使いたいかもしれません。 – Stefano

2

をこのタイプのコードを書くことはお勧めできませんが、あなたの道をハックしたい場合は、次のようなことをすることができます: -

int main() 
{ 
Block*** grid;  

grid = new Block**[10];   
for(int i = 0 ; i < 10 ; i++) 
{  
    grid[i] = new Block*[10]; 
} 

/*Here, we have created a grid of pointers*/ 

/* 

|Block**[10]| 

|Block[0] **|------------->|Block* [10]| 
|Block[1] **|------------->|Block* [10]| 
|Block[2] **|------------->|Block* [10]| 
|Block[3] **|------------->|Block* [10]| 
.. 
.. 
|Block[9] **|------------->|Block* [10]| 

*/ 

for(int i = 0 ; i < 10 ; i++) 
{  
    for(int j = 0 ; j < 10 ; j++) 
    { 
     grid[i][j] = new Block[10]; 
    } 
} 

/* 

|Block**[10]| 

|Block[0] **|------------->|Block* [0]|------------->|Block1|Block2| .. |Block10| 
          |Block* [1]|------------->|Block1|Block2| .. |Block10| 
          |Block* [2]|------------->|Block1|Block2| .. |Block10| 
          .. 
          |Block* [9]|------------->|Block1|Block2| .. |Block10| 


|Block[1] **|------------->|Block* [0]|------------->|Block1|Block2| .. |Block10| 
          |Block* [1]|------------->|Block1|Block2| .. |Block10| 
          |Block* [2]|------------->|Block1|Block2| .. |Block10| 
          .. 
          |Block* [9]|------------->|Block1|Block2| .. |Block10|   
|Block[2] **| 
|Block[3] **| 
.. 
.. 
|Block[9] **| 

*/ 
} 
+0

どのようなコードを書くことをお勧めしますか? – user463035818

+0

@ tobi303私は、可能な限り、スマートポインタやメモリを管理する 'std :: vector'を使うべきであることを意味しています。 – Vishal

+0

これはあなたの答えに言及する必要があります – user463035818

0

は、2Dアレイの線形表現を使用する:

std::unique_ptr<int[]> array(new int[rowCount*colCount]); 

for (size_t r = 0; r < rowCount; r++) 
    for (size_t c = 0; c < colCount; c++) 
    (array.get())[r*colCount + c] = r*c; 
0
ポインタの

Alocatingアレイは、スレッドセーフな方法で行うことができる:上記のコードに注意することが

size_t allocatedRows = rowCount; 
     try{ 
      array = new char*[allocatedRows]; 
      while(allocatedRows){ 
       --allocatedRows; 
       array[allocatedRows] = new char[colCount]; 
      } 
     }catch(std::bad_alloc& ex){ 
      while(++allocatedRows < lines) 
       delete array[allocatedRows]; 
      delete array; 
      throw; 
     } 

つ事:
1)allocatedRows
2)ポインタの配列を割り当てた後、逆参照配列elemntsは、(割り当てのない通常のポインタのように)未定義の動作をします。 上記の場合、私はbad_allocからリカバリしなかったので、私はただ再スローされました。終了の呼び出しの前に別​​の場所に記録することができます。他のユーザ定義のオブジェクトからポインタの配列を作成したい場合は、std :: uninitialized_copyまたはstd :: uninitialized_fillを使用できます。 もう一つの方法は、ベクターを使うことだけです。

関連する問題