作为具有任意边界的 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
而不是数组。
不是 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
而不是数组。