2017-05-31 118 views
0

我曾嘗試使用以下方式分配一個三維:一個的unique_ptr管理三維陣列

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公開的接口。

+0

不要爲此使用'std :: unique_ptr',請使用'std :: vector'。 – SergeyA

+0

@SergeyA你是什麼意思?我正在分配一個三維數組。我如何使用一個矢量呢? – primeQuestion

+0

你確定你想每行/每列有不同的尺寸嗎?否則,你可以只分配一次「深度*行*列」。 – erenon

回答

5

從表面上看,你可以寫這樣的:

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'; 
     } 
    } 
} 

,這將更多或更少的工作,你所期望的方式。

神聖意大利麪條碼,蝙蝠俠!這是一些嚴重草率的代碼!

你可以簡化像這樣使用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矩形矩陣,這樣寫就沒有多大意義。相反,讓我們做到這一點:

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類處理自身所有這個翻譯。然後,你可以編寫代碼,看起來像這樣:

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'; 
      } 
     } 
    } 

} 

哪個更乾淨,更容易維護,如果你讓你Matrix類通用的,可重複使用的其他東西。