作为具有任意边界的类成员的多维数组
Multidimensional arrays as class member with arbitrary bounds
不是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
而不是数组。
相关文章:
- 是否可以将结构数组别名为结构成员数组?
- C++:初始化 constexpr 构造函数中的成员数组
- 使用带有参数包的数组的成员数组初始化类
- C++ 在析构函数调用之前删除的动态成员数组
- 初始化在类类型 #define 中定义的非静态成员数组,不带默认 ctor
- 指向具有不同大小的成员数组的指针
- 用另一个 constexpr 数组对成员数组进行大括号初始化
- 对象成员数组C++默认初始化
- 如何在构造函数中的类成员数组中分配数组值,而无需使用STD库
- 将类成员数组组合到单个数组时性能下降
- 如何将数据从公共方法添加到同一类中的私有成员数组中?
- 如何在C 中的派生类中分配数据成员数组
- C 集合构建器中类成员数组的2D数组大小
- 初始化不可复制、不可移动、显式构造类型的成员数组
- C 指针可以指向字符串文字的静态成员数组
- 成员数组位于何处
- 将对象成员数组与字符串进行比较
- 如何在 c++ 中从对象数组中获取数据成员数组
- 声明模板会员参考另一个类的模板成员数组
- C 初始化成员数组