多维数组作为具有任意边界的类成员

时间:2015-03-27 22:00:37

标签: c++ arrays multidimensional-array syntax instantiation

不是C++: multidimensional array initialization in constructor的副本,因为所有的答案都出现,以假设在编译时已知边界。

我制作了一个加权无向图表类arraygraph,由int的二维数组支持,名称为edges[][]。在实例化时,我并不关心edges[][]持有什么; arraygraph有一个方法可以从给定的文件名中读取图表,edges被设置为new int[n][n](其中n是文件中的节点数)在填充它之前。

麻烦的是,g ++似乎并不喜欢我定义edges[][]的方式。它希望为数组设置边界,并且在编译时我不知道边界。我应该将edges重新定义为int *吗?还是edges[][0]?或完全不同的东西?

我无论如何都不是C ++专家(我是蟒蛇人),如Array with undefined size as Class-member中那些复杂,重量级的选项有点超出范围(当然有'比 ...更简单的方法。如果我试图做的事情完全是错误的,那么知道也是一件有用的事情,并且知道我应该做什么也很方便。

2 个答案:

答案 0 :(得分:1)

C ++并不知道变长数组。因此,您需要使用常量大小定义数组。重新定义阵列是不可能的。

多维数组的两个选项:

  • 动态数组数组,实现为int **edges
  • std :: vector而不是vector<vector<int>> edges;
如果您需要复制数据(在单个语句中完成)或更改大小,

向量非常方便。所以我建议第二个选项:

int N=10; // dynamic! 
vector<vector<int>> m(N, vector<int>(N));

使用指针的替代方法是:

int N=10; // dynamic! 
int**m = new int*[N];    // allocate the first array 
for (int i = 0; i < N; i++) {  // allocate the second arrays
    m[i] = new int[N]{};
}

在这两种情况下,您都可以使用相同的语法访问数据:

for (int i = 0; i < N; i++) {
    for (int j = 0; j < N; j++)
        cout << m[i][j] << "\t";
    cout << endl;
}

答案 1 :(得分:0)

看来你正在寻找一种动态大小的数组。尝试使用std::vector而不是数组。