粗糙的四维数组
C++ - ragged 4d array
我正在编写一个程序,它需要使用一个非常原始的(至少对我来说是新的)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];
};
相关文章:
- 指向多维数组C++的指针
- C++使用数组作为多维数组,尽管将其初始化为带有指针的 1D
- 将值从二维数组输出到文本文件
- 在二维数组中查找最小值和最大值?
- 使用递归模板动态分配的多维数组
- 多维数组 C++ 中数组下标的类型"int[int]"无效
- 移动二维数组中的字符
- 如何正确填充在堆上分配的二维数组?
- 传递二维数组时出现问题
- 具有随机数的二维数组不会更改
- 为什么我们将单个或多维数组的大小声明为常量值?
- 如何在C++中获取二维数组中最少的一列数?
- 字符在多维数组中重复
- 如何将零填充的多维数组传递给 C++ 中的函数?
- 如何使用用户输入变量制作二维数组?
- C++ 中动态二维数组的访问冲突
- 有效地计算多维数组的累积和?
- 遍历二维数组的所有子数组
- 将二维数组的所有元素插入到一维数组中
- 粗糙的四维数组