2017-05-31 15 views
0

を管理するためにunique_ptrを使用:私は、次の方法を使用して三次元を割り当てた3次元アレイ

board = new char**[depth]; 
    for (int d = 0; d < depth; d++) 
    { 
     board[d] = new char*[rows]; 
     for (int i = 0; i < rows; i++) { 
      board[d][i] = new char[cols]; 
      for (int j = 0; j < cols; j++) { 
       board[d][i][j] = 'k'; 
      } 
     } 
    } 

は今、私はそれを管理するためにunique_ptrをを使用したいが、私は開始する方法がわかりませんそのような構造は、unique_ptrが公開するインタフェースを使用します。

std::unique_ptr<std::unique_ptr<std::unique_ptr<char[]>[]>[]>board = 
    std::make_unique<std::unique_ptr<std::unique_ptr<char[]>[]>[]>(depth); 
for (int d = 0; d < depth; d++) 
{ 
    board[d] = std::make_unique<std::unique_ptr<char[]>[]>(rows); 
    for (int i = 0; i < rows; i++) { 
     board[d][i] = std::make_unique<char[]>(cols); 
     for (int j = 0; j < cols; j++) { 
      board[d][i][j] = 'k'; 
     } 
    } 
} 

を、これは意志、多かれ少なかれ、あなたが期待するように動作します:

+0

これに 'std :: unique_ptr'を使用しないで' std :: vector'を使用してください。 – SergeyA

+0

@SergeyAどういう意味ですか?私は3次元配列を割り当てています。どのようにベクトルを使うことができますか? – primeQuestion

+0

各行/列の寸法を変えてもよろしいですか? そうでなければ、 'depth * rows * cols'をワンショットで割り当てることができます。 – erenon

答えて

5

表向きは、あなたがこのようにそれを書くことができます。

しかしバリー・スパゲッティコード!それはいくつかの真剣にお粗末なコードです!

あなたは配列・オブ・アレー・オブ・配列を表現するためのはるかに自然な構造であるstd::vectorを使用して、このようにそれを簡素化することができます:

std::vector<std::vector<std::vector<char>>> board; 
board.resize(depth); 
for (int d = 0; d < depth; d++) 
{ 
    board[d].resize(rows); 
    for (int i = 0; i < rows; i++) { 
     board[d][i].resize(cols); 
     for (int j = 0; j < cols; j++) { 
      board[d][i][j] = 'k'; 
     } 
    } 
} 

しかし、あなたは、本質的に3Dで何を書いていることを考えるとRectangle Matrixでは、このように書くのはまだまだ意味がありません。代わりに、はこのやろう:

size_t get_index(size_t i, size_t j, size_t k, size_t rows, size_t cols, size_t depth) { 
    if(i > rows || j > cols || k > depth) throw std::runtime_error("Out of bounds!"); 
    return k * rows * cols + j * rows + i; 
} 

size_t get_size(size_t rows, size_t cols, size_t depth) { 
    return rows * cols * depth; 
} 

int main() { 
    size_t rows = 15, cols = 10; depth = 5; 
    std::vector<char> board(get_size(rows, cols, depth)); 
    for(size_t d = 0; d < depth; d++) { 
     for(size_t r = 0; r < rows; r++) { 
      for(size_t c = 0; c < cols; c++) { 
       board[get_index(r, c, d, rows, cols, depth)] = 'k'; 
      } 
     } 
    } 

} 

あなたは自分自身ですべてのこの翻訳を扱うMatrixクラスにこのすべてを包む考えるかもしれません。あなたが他のもののためにあなたのMatrixクラスは、一般的な再利用可能にする場合

int main() { 
    size_t rows = 15, cols = 10; depth = 5; 

    Matrix<char> board(rows, cols, depth); 
    for(size_t d = 0; d < board.get_depth(); d++) { 
     for(size_t r = 0; r < board.get_rows(); r++) { 
      for(size_t c = 0; c < board.get_cols(); c++) { 
       board(r, c, d) = 'k'; 
      } 
     } 
    } 

} 

維持するために、はるかにクリーンはるかに簡単です、そして:そして、あなたは、このようなコードを記述することができると思います。

関連する問題