最简单的2D数组,使用g ++,有一个可变维度?

时间:2014-08-03 20:11:09

标签: c++ arrays dynamic 2d

我想制作一个这样的数组:

double array[variable][constant];

只有第一个维度是可变的。将变量声明为第一个维度会产生初始化错误。使用指针或其他基本类型有一种简单的方法吗?

2 个答案:

答案 0 :(得分:1)

可变长度数组没有使用最新的C ++标准。您可以使用std::vector代替

std::vector<std::vector<double> > arr;

或者,要修复例如第二个维度(在此示例中为10),您可以执行

std::vector<std::array<double, 10> > arr1; // to declare a fixed second dimension

否则你需要使用旧指针,

double (*arr)[10]; // pointer to array-of-10-doubles

根据@Chiel的评论,为了提高性能,你可以做到

typedef double (POD_arr)[10];
std::vector<POD_arr> arr;

通过这种方式,您可以将所有数据连续存储在内存中,因此访问速度应与使用普通旧C数组一样快。

PS:似乎最后一个声明违反了标准,因为正如@juanchopanza所提到的,POD数组不满足要存储在STL数组中的数据要求(它们不可分配)。但是,g++编译上述2个声明没有任何问题,可以在程序中使用它们。但是clang++失败了。

答案 1 :(得分:0)

你可以做类似的事情,但它不是真正的2D数组。它基于一般的想法,即内部多维数组必须与对于维数(n,m)数组的规则成线性关系:array2d[i, j] = array1d[j + i*m]

#include "iostream"

using namespace std;

class dynArray {
private:
    double *array;
    int dim2;
public:
    dynArray(int variable, int constant) {
        array = new double[variable * constant];
    dim2 = constant;
    }
    ~dynArray() {
        delete array;
    }

    double value(int i, int j) {
        return array[j + i * dim2];
    }

    double *pt(int i, int j) {
        return array + j + i * dim2;
    }
};

int main(int argc, char*argv[]) {
    dynArray d(3,4);
    *d.pt(2,3) = 6.;
    cout << "Result : " << d.value(2,3) << endl;
    return 0;
}