我们在学校教的是:
int x;
cin >> x;
int array[x];
OR
int x, y;
cin >> x >> y;
int array[x][y];
但是,我知道它在C ++中是无效的代码。但即便如此,它仍然可以完成工作并按预期工作,但是,我希望找到它如何正确完成的答案?
答案 0 :(得分:5)
这不是标准的C ++,但包括gcc和clang在内的许多编译器都支持variable length arrays作为 C ++ 的扩展,即使它是 C99 功能。如果gcc
标志与类似的消息一起使用,则clang
和-pedantic
都会警告您这是一个扩展名:
警告:ISO C ++禁止变长数组'array'[-Wvla]
标准C ++中的替代方案是使用std::vector或通过 new 进行动态分配:
int x;
cin >> x;
int *array new int[x] ;
//...
delete [] array ;
2D 动态分配案例在How do I declare a 2d array in C++ using new?中得到了很好的介绍。使用容器可能更好,因为您不必担心删除之后分配的内存。
答案 1 :(得分:5)
适当地使用动态数组:
int x;
cin >> x;
int* array = new int[x];
请注意,在这种情况下,您有责任释放分配的内存;或使用智能指针。
另一种方法是使用STL容器,例如vector
。
答案 2 :(得分:3)
通常通过使用标准容器std :: vector或通过在堆中动态分配数组来完成。例如
int x, y;
cin >> x >> y;
int **array = new int * [x];
for ( size_t i = 0; i < x; i++ ) array[i] = new int[y];
答案 3 :(得分:3)
获得动态大小数组的最简单方法是使用std::vector
:
int x;
cin >> x;
vector<int> array(x);
多维数组有点复杂;一个选项是:
int x, y;
cin >> x >> y;
vector<vector<int>> array(x, vector<int>(y));
更高效,但不那么简单,您可以考虑使用大小为x*y
的一维数组,其中访问器函数将被视为二维。