C++ 如何按行主顺序声明3DArray?
我编写了一个类,该类将2D数组存储为1D数组,并重载索引运算符,如下所示:C++ 如何按行主顺序声明3DArray?,c++,arrays,C++,Arrays,我编写了一个类,该类将2D数组存储为1D数组,并重载索引运算符,如下所示: inline T* operator [](const int Index) {return Data.get() + Height * Index;} 其中数据为std::unique\u ptr 这允许我执行以下操作:MyInstance[I][J]以行主顺序获取值,MyInstance[J][I]以列主顺序获取值 如何对3D阵列执行相同的操作?我想弄清楚它在记忆中是如何排列的,所以我做到了: int main()
inline T* operator [](const int Index) {return Data.get() + Height * Index;}
其中数据为std::unique\u ptr
这允许我执行以下操作: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;
}
有什么想法吗?线性指数计算如下
dim1 + dim2*size1 + dim3*size1*size2
差不多
std::vector< std::vector< std::vector<int> > > arr;
因为每个
[]
运算符返回的向量
具有重载的[]
运算符。而不是重载索引运算符运算符[]
重载函数运算符运算符()
,这将允许传递多个值
inline T& operator ()(int i, int j, int k) { /* return the indexed item here */ }
似乎计算的索引与我在OP上的相同,但它应该与定义矩阵和循环顺序的方式相匹配。选择像
int-arr[size1][size2][size3]这样的声明
我想你可能想使用std::unique\u ptr
而不是std::unique\u ptr
我通过arr[k+j*深度+I*深度*高度]解决了这个问题。
int arr[depth][height][width];
inline T& operator ()(int i, int j, int k) { /* return the indexed item here */ }