粗糙的四维数组

C++ - ragged 4d array

本文关键字:四维 数组      更新时间:2023-10-16

我正在编写一个程序,它需要使用一个非常原始的(至少对我来说是新的)int数组。它应该看起来像:my_array[一][b] [c] [d]

a从0到N_CORES-1,其中N_CORES是运行机器上的CPU核数,从一开始就由open-mp定义。

c, d取0到ARG之间的值,ARG是用户传递的一行参数

但是b需要在0和一个值之间运行,这取决于a(不是每个核心都一样)。

我尝试用new分配器创建这个对象:

for(int i =0;i < N_CORES; i++){
    my_array[i] = new int**[size_for_i];

,但我得到一个段错误稍后。是因为这不是定义这些锯齿数组的正确方法吗?我应该用向量吗?我从来没有用矢量做过四维的东西所以我有点迷失了。

编辑:实际上我决定用另一种方式来实现它,用一个"只有"3d的数组,合并我以前对象的两个前索引。非常感谢你的建议!

try this:

int ***my_array[N_CORES];
for(int a = 0; a < N_CORES; a++)
{
    my_array[a] = new int**[size_for_a];
    for( int b = 0; b < size_for_a[a]; b++)
    {
        my_array[a][b] = new int*[ARG];
        for( int c = 0; c < ARG; c++)
        {
             my_array[a][b][c] = new int[ARG];
        }
    }
}

将数据分成不同的级别可能更容易。在每个级别定义重载operator []函数以提供语法糖。

struct Level1Data
{
   int& operator [](int i) {return d[i];}
   int* d;
};
struct Level2Data
{
   Level1Data& operator [](int i) {return c[i];}
   Level1Data* c;
};
struct Level3Data
{
   Level2Data& operator [](int i) {return b[i];}
   Level2Data* b;
};
struct Level4Data
{
   Level3Data& operator [](int i) {return a[i];}
   Level3Data* a;
};
void foo()
{
   Level4Data myinfo;
   int k = myinfo[0][4][3][10];
};

根据presius litel snoflek的建议,采用递归模板方法处理数据。

template <int Level, typename Data>
struct MemberData
{
   MemberData<Level-1, Data>& operator [](int i) {return data[i];}
   MemberData<Level-1, Data>* data;
};
template <typename Data>
struct MemberData<0, Data>
{
   Data& operator [](int i) {return data[i];}
   Data* data;
};
void bar()
{
   MemberData<3, int> myinfo;
   int k = myinfo[0][4][3][10];
};