我编写了一个将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];
有什么想法吗?
答案 0 :(得分:1)
像
这样的东西std::vector< std::vector< std::vector<int> > > arr;
访问将是
int arr[depth][height][width];
因为每个[]
运算符都会返回vector
运算符过载的[]
。
答案 1 :(得分:0)
线性指数计算如下
dim1 + dim2*size1 + dim3*size1*size2
答案 2 :(得分:0)
而不是重载索引运算符operator[]
重载函数运算符operator()
,这将允许传递多个值。
inline T& operator ()(int i, int j, int k) { /* return the indexed item here */ }