如何按行主要顺序声明 3DArray
How to declare a 3DArray in Row Major Order?
我编写了一个类,它将 2D 数组存储为 1D 数组并重载索引运算符,如下所示:
inline T* operator [](const int Index) {return Data.get() + Height * Index;}
其中数据是std::unique_ptr<int[]>
。
这允许我做:MyInstance[I][J]
获取值作为行主顺序,MyInstance[J][I]
获取值作为列主顺序。
如何对 3D 阵列执行相同的操作?我试图弄清楚它在内存中的布局方式,所以我做到了:
int main()
{
//index = [i + width * (j + depth * k)];
const int width = 4, height = 4, depth = 4;
int l = 0;
int ptr[width][height][depth] = {0}; //Same as int ptr[width * height * depth]; ?
//int ptr[height][width][depth]??
for (int i = 0; i < depth; ++i) //i < ??
{
for (int j = 0; j < height; ++j) //j < ??
{
for (int k = 0; k < width; ++k) //k < ??
{
ptr[i][j][k] = l++;
}
}
}
int* p = &ptr[0][0][0];
for (int i = 0; i < depth; ++i)
{
for (int j = 0; j < height; ++j)
{
for (int k = 0; k < width; ++k)
{
std::cout<<p[i + width * (j + depth * k)]<<"n";
}
}
}
return 0;
}
但是,它不会以正确的顺序打印。它似乎以随机顺序或列主要顺序打印。
我不确定如何声明数组:
int arr[depth][height][width];
int arr[width][height][depth];
int arr[height][width][depth];
int arr[depth][width][height];
int arr[height][depth][width];
int arr[width][depth][height];
有什么想法吗?
类似
std::vector< std::vector< std::vector<int> > > arr;
访问将是
int arr[depth][height][width];
因为每个[]
运算符都返回具有重载[]
运算符的vector
。
线性指数计算如下
dim1 + dim2*size1 + dim3*size1*size2
不是重载索引运算符operator[]
重载函数运算符operator()
这将允许传递多个值。
inline T& operator ()(int i, int j, int k) { /* return the indexed item here */ }
相关文章:
- .cpp和.h文件中的模板专用化声明
- 未在作用域中声明unordered_map
- C++避免重复声明的语法是什么
- 如何确保C++函数在定义之前声明(如override关键字)
- 错误:未在此范围内声明'reverse'
- 奇怪的(对我来说)返回声明 - 在谷歌上找不到任何关于它的信息
- 为什么在定义函数之前先声明它
- 如何声明特征矩阵,然后通过嵌套循环初始化它
- #ifdef和未声明的标识符
- 没有显式声明的int[]中的foreach
- 在基于范围的for循环中使用结构化绑定声明
- 在将变量声明为引用时,堆在释放后使用
- C++:无法访问声明的受保护成员
- 为什么我不能在一个类的不同行中声明和定义成员变量?
- 我不明白为什么我声明一个空的内部结构并将其传递给构造函数
- 使用cmake从源代码构建MySQL连接器/C++失败(与以前的声明冲突)
- 在函数内部的声明中初始化数组,并在外部使用它
- Visual Studio中的函数声明和函数定义问题
- c++类声明时,相同的例程,不同的成员变量类型
- 如何按行主要顺序声明 3DArray