使用unique_ptr来管理三维数组
Using a unique_ptr to manage a three dimensional array
我使用以下方式分配了三维:
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';
}
}
}
这将以您期望的方式或无数的方式工作。
但是圣意大利面条代码,蝙蝠侠!这是一些严重的草率代码!
您可以使用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
类通用,则可以重复使用。
相关文章:
- 如何将三维尺寸不固定的三维阵列展平为一维阵列
- 如何使用qt缩放三维网格
- 三维数组中的C/C++DWORD到BYTE和BYTE到DWORD的转换
- 使用vtkImageReslice重新切片三维原始图像
- 特征:创建一个具有函数的三维阵列
- 扩充矩阵的行缩减-三维样条曲线计算
- 使用pcl transformcloud将三维点平移并旋转到原点
- 用C++从三维矢量中删除元素
- 如何访问CGAL三维三角测量中的面
- 如何在Openscenegraph中从二维鼠标点击的屏幕坐标点计算三维点(世界坐标)
- std::将三维数组复制到三维向量中
- 显示结构的三维数组
- 如何将X 2维数组连接到一个三维阵列中
- 使用unique_ptr来管理三维数组
- 如何访问三维矩阵元素
- 无法访问三维数组中的特定位置
- 如何将 HDC 位图快速复制到三维阵列?
- 内存相关崩溃:Cocos2d游戏中的三维数组
- 如何使用opencv和c++实现三维sift算法
- 如何根据给定Z值的图片计算三维坐标