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

Multidimensional arrays as class member with arbitrary bounds

本文关键字:成员 数组 边界 任意      更新时间:2023-10-16

不是C++的重复:构造函数中的多维数组初始化,因为所有的答案都会出现,以假设在编译时边界是已知的。

我正在制作一个加权无向图类arraygraph,由int的2D数组支持,名为edges[][]。在实例化时,我并不真正关心edges[][]持有什么;arraygraph有一个从给定文件名中读取图形的方法,edges在填充之前由该函数设置为new int[n][n](其中n是文件中的节点数)。

问题是,g++似乎不喜欢我定义edges[][]的方式。它想为数组设置边界,在编译时我不知道边界。我应该将edges重新定义为int *吗?还是作为edges[][0]?或者完全是别的什么?

无论如何,我都不是C++专家(我是一个Python类型的人),所以复杂、重量级的选项,比如Array中大小未定义为Class成员的选项,有点超出了范围(当然有一种比更简单的方法,那就是…)。如果我试图做的事情完全是错误的,那么这也是一件有用的事情,知道我应该做什么会很方便。

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;
}

您似乎在寻找某种动态大小的数组。尝试使用std::vector而不是数组。