C++:创建一个用户输入大小的数组

Moh*_*asi 3 c++ arrays

与许多SO用户相比,我对C++相对较新.

我想知道我们是否制作了一个用户指定大小的数组.

例如:

int a;
cout<<"Enter desired size of the array";
cin>>a;
int array[a];
Run Code Online (Sandbox Code Playgroud)

但是上面的程序不会工作,因为数组大小必须是常量,但在我的情况下,它是一个变量.

那么是否可以将变量变为常量并将其指定为数组的大小?

寻找一个简单易懂的答案,感谢您的时间和精力:)

Dan*_*iel 12

在C++中,有两种类型的存储:基于堆栈的内存和基于的内存.基于堆栈的内存中对象的大小必须是静态的(即不更改),因此必须在编译时知道.这意味着你可以这样做:

int array[10]; // fine, size of array known to be 10 at compile time
Run Code Online (Sandbox Code Playgroud)

但不是这个:

int size;
// set size at runtime
int array[size]; // error, what is the size of array?
Run Code Online (Sandbox Code Playgroud)

请注意,量值与编译时已知的值之间存在差异,这意味着您甚至无法执行此操作:

int i;
// set i at runtime
const int size = i;
int array[size]; // error, size not known at compile time
Run Code Online (Sandbox Code Playgroud)

如果需要动态大小的对象,可以使用某种形式的new运算符访问基于堆的内存:

int size;
// set size at runtime
int* array = new int[size] // fine, size of array can be determined at runtime
Run Code Online (Sandbox Code Playgroud)

然而,这种"原始"的使用new不建议你必须使用delete恢复分配的内存.

delete[] array;
Run Code Online (Sandbox Code Playgroud)

这是一种痛苦,因为你必须记住delete你创造的一切new(并且只有delete一次).幸运的是,C++有许多数据结构可以为你做这件事(即他们使用newdelete幕后动态地改变对象的大小).

std::vector是这些自我管理数据结构的一个例子,它是数组的直接替代品.这意味着你可以这样做:

int size;
// set size at runtime
std::vector<int> vec(size); // fine, size of vector can be set at runtime
Run Code Online (Sandbox Code Playgroud)

并且不必担心newdelete.它会变得更好,因为在添加更多元素时std::vector自动调整大小.

vec.push_back(0); // fine, std::vector will request more memory if needed
Run Code Online (Sandbox Code Playgroud)

总结:除非你在编译时知道大小(在这种情况下,不要使用new),否则不要使用数组,而是使用std::vector.


Jar*_*d42 5

使用std::vector(需要标题<vector>):

int size;
cout<<"Enter desired size of the array";
cin >> size;
std::vector<int> array(size);
Run Code Online (Sandbox Code Playgroud)