具有两个动态维和一个静态维的多维数组

时间:2019-01-04 19:09:18

标签: c++ arrays dynamic-memory-allocation

我知道我可以声明一个具有如下动态维度的数组:

double(*LHS)[3][3][3] = new double[M + 2][3][3][3];

但是我需要声明一个具有“两个”动态维的数组。我检查了如下语法:

double (**U)[3] = new double*[M + 2][3];    
for (int i = 0; i < M + 2; ++i) U[i][3] = new double[N + 2][3];

但这不起作用!

请帮助我正确定义具有动态尺寸的三维数组。

1 个答案:

答案 0 :(得分:0)

您可以用来调用函数

void SolveBlockTri(double LHS[][3][3][3], double RHS[][3], int iNRows)

使用惯用的c ++技术进行动态分配是:

int nRows = 42;
std::vector<std::array<std::array<std::array<double>,3>,3,3> lhs; 
    // = where ever you fill that from;
std::vector<std::array<double,3>> rhs,nRows);

SolveBlockTri(&(lhs.data()), &(rhs.data()), nRows);   

您还可以根据固定大小的部分使用模板化包装器功能:

template<size_t FixedSize>
void CallSolveBlockTri(
    const std::vector<std::array<std::array<std::array<double>
                     ,FixedSize>,FixedSize,FixedSize>& LHS
  , std::vector<std::array<double,FixedSize>>& RHS
  , int iNRows) {
    SolveBlockTri(&(LHS.data()), &(RHS.data()), iNRows);
};

  

但是我发现声明4d动态数组(然后删除它!)非常复杂。

请注意,使用上面概述的两种解决方案,您无需使用newdelete运算符进行任何手动数组分配。
容器类 std::vector std::array 已经可以正确处理所有这些东西。