与许多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++有许多数据结构可以为你做这件事(即他们使用new和delete幕后动态地改变对象的大小).
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)
并且不必担心new或delete.它会变得更好,因为在添加更多元素时std::vector会自动调整大小.
vec.push_back(0); // fine, std::vector will request more memory if needed
Run Code Online (Sandbox Code Playgroud)
总结:除非你在编译时知道大小(在这种情况下,不要使用new),否则不要使用数组,而是使用std::vector.
使用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)