我使用以下方式分配了三维:
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 :(得分: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';
}
}
}
这会或多或少地以你期望的方式运作。
但神圣意粉代码,蝙蝠侠!这是一些严重邋code的代码!
您可以使用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
类具有通用性,则可以重复使用其他内容。