我需要创建一个给定大小的方阵。我知道如何创建给定大小的动态一维数组。不能像下面的几行那样对两个二维数组进行相同的工作?
cin>>size;
int* a[][]=new int[size][size]
int* a[][]=new int[size][size]
不,这不起作用。
main.cpp:4: error: only the first dimension of an allocated array may have dynamic size
new int[size][size];
^~~~
如果行的大小是固定的,则可以执行以下操作:
// allocate an array with `size` rows and 10 columns
int (*array)[10] = new int[size][10];
在C ++中,不能有两个维度都是动态的原始数组。这是因为原始数组索引在指针方面起作用;例如,为了访问第二行,指向第一行的指针需要增加该行的大小。但是,当行的大小是动态的时,数组不知道该大小,因此C ++不知道如何弄清楚如何进行指针递增。
如果您想要一个具有多个动态维度的数组,则需要构造数组分配,以便C ++的默认数组索引逻辑可以处理它(例如,该重复问题的最高级答案),或者您需要实现用于确定逻辑的逻辑适当的指针会自己增加。
对于每行具有相同大小的数组,我建议不要使用多个分配(如那些答案所建议的)或使用向量向量。使用向量矢量解决了手工进行分配的困难和危险,但是它仍然使用了比必要更多的内存,并且不允许更快的内存访问模式。
扁平化多维数组的另一种方法可以使代码像其他任何方法一样易于读写,不使用额外的内存,并且可以执行很多更好的操作。
展平的数组意味着您仅使用具有与所需2D数组相同数量的元素的单个三维数组,并执行在多维索引和相应的一维索引之间进行转换的算术运算。有了new
它看起来像:
int *arr = new int[row_count * column_count];
2d数组中的rowi
和columnj
对应于arr[column_count*i + j]
。arr[n]
对应于rown/column_count
和column的元素n% column_count
。例如,在具有10列的数组中,第0行第0列对应于arr[0]
;第0行第1列对应于arr[1]
; 第1列第0列对应于arr[10]
; 第1列,第1列对应于arr[11]
。
您应该避免使用rawnew
和进行手动内存管理delete
,例如int *arr = new int[size];
。相反,资源管理应该包装在RAII类中。用于管理动态分配的内存的RAII类的一个示例是std::vector
。
std::vector<int> arr(row_count * column_count);
arr[column_count*i + j]
您可以在另一个类中进一步包装用于计算索引的逻辑:
#include <vector>
class Array2d {
std::vector<int> arr;
int columns;
public:
Array2d(int rows, int columns)
: arr(rows * columns)
, columns(columns)
{}
struct Array2dindex { int row; int column; };
int &operator[] (Array2dindex i) {
return arr[columns*i.row + i.column];
}
};
#include <iostream>
int main() {
int size;
std::cin >> size;
Array2d arr(size, size);
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
arr[{i, j}] = 100;
}
}
for (int i = 0; i < size; ++i) {
for (int j = 0; j < size; ++j) {
std::cout << arr[{i, j}] << ' ';
}
std::cout << '\n';
}
}
本文收集自互联网,转载请注明来源。
如有侵权,请联系 [email protected] 删除。
我来说两句