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

Multidimensional arrays as class member with arbitrary bounds

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

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

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

无论如何我都不是 C++ 专家(我是 Python 那种人)如此复杂、重量级的选项,如 Array with undefined size as Class-member 中的选项有点超出范围(肯定有比 that... 更简单的方法)。如果我正在尝试做的事情完全是错误的,那也是一件有用的事情,知道我应该做什么会很方便。

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 而不是数组。