【问题标题】:dynamic 4d array c++ with dynamic borders具有动态边界的动态 4d 数组 c++
【发布时间】:2020-12-22 21:48:14
【问题描述】:

我尝试制作一个 4D 数组,如果尺寸 WxXxYxZ 像 W= 7 一样固定,则似乎可以正常工作; X=5, Y=10, Z= 2。但我的代码需要适用于具有可变边框的维度:

int chainCount = 10;
int * beadCount = new int[N];// N >= chainCount 
// for example: beadCount = { 5, 7, 8, ... , 12}

//4D array:
double **** r = new double*** [chainCount];
 for(int i=0; i < chainCount; i++){
        r[i] = new double**[beadCount[i]];
        for(int j=0; j < beadCount[i]; j++){
            r[i][j] = new double *[chainCount];
            for(int k=0; k< chainCount;k++)
                r[i][j][k] = new double[beadCount[k]];
        }
 }
/*
...
*/
    for(int i=0; i < chainCount; i++){
        for(int j=0; j < beadCount[i]; j++){
            for(int k=0; k< chainCount;k++){
                delete[] r[i][j][k];
            }   
            delete[] r[i][j];
        }
        delete[] r[i];
    }
    delete[] r;

这总是会导致分段错误。但只有当我使用 beadCount[i] 时,通过将 beadCount[i] 替换为固定数字似乎才有效。

【问题讨论】:

  • 恭喜你现在是 4 星程序员。我建议您使用 std::vector&lt;std::vector&lt;std::vector&lt;std::vector&lt;int&gt;&gt;&gt;&gt; 而不是原始数组定义,并让标准库为您进行必要的内存管理。
  • 即使是 4 星编程,也请发布minimal reproducible example,而不仅仅是分配和解除分配的代码。您的描述听起来像是问题出在您没有向我们展示的代码中。用可变数量的项目替换一个常数应该不会导致任何问题。

标签: c++ arrays multidimensional-array dynamic


【解决方案1】:

我可以建议一个更好的方法来看待这个吗?

将对象视为 容器,其键是“4 元组”(w,x,y,z).

如果特定的“维度”具有范围约束,则很容易实现。如果您需要遍历元组,您也可以这样做。但是容器只存储实际设置的值——所有其他元组键都返回一个默认值,例如0null

您可以在这里使用许多可用的容器类。您所需要的只是一个将元组转换为他们可以使用的某种键的函数。例如,sprintf() 可以做到。您的类的实现只是简单地实例化一个“库存”容器类并使用它,同时也将它隐藏起来。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2013-12-23
    • 2019-11-12
    • 1970-01-01
    • 2019-11-24
    • 2013-06-22
    • 2011-05-02
    • 1970-01-01
    相关资源
    最近更新 更多