与许多SO用户相比,我对C ++相对较新。
我想知道我们是否制作了一个用户指定大小的数组。
例如:
int a;
cout<<"Enter desired size of the array";
cin>>a;
int array[a];
但是上面的程序不会工作,因为数组大小必须是常量,但就我而言,它是一个变量。
那么可以将变量变成常量并将其指定为数组的大小吗?
寻找一个简单易懂的答案,感谢您的时间和精力:)
答案 0 :(得分:7)
在C ++中,有两种类型的存储:基于堆栈的内存和基于堆的内存。基于堆栈的内存中对象的大小必须是静态的(即不要更改),因此必须在编译时知道 。这意味着你可以这样做:
int array[10]; // fine, size of array known to be 10 at compile time
但不是这样:
int size;
// set size at runtime
int array[size]; // error, what is the size of array?
请注意,常量值与编译时已知的值之间存在差异,这意味着您甚至无法执行此操作:
int i;
// set i at runtime
const int size = i;
int array[size]; // error, size not known at compile time
如果需要动态大小的对象,可以使用某种形式的new
运算符访问基于堆的内存:
int size;
// set size at runtime
int* array = new int[size] // fine, size of array can be determined at runtime
但是,new
的“原始”使用不推荐,因为您必须使用delete
来恢复已分配的内存。
delete[] array;
这很痛苦,因为您必须记住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
并且不必担心new
或delete
。它会变得更好,因为std::vector
会在添加更多元素时自动自行调整大小。
vec.push_back(0); // fine, std::vector will request more memory if needed
总结:除非您在编译时知道大小(在这种情况下,请不要使用new
),否则不要使用数组,而是使用std::vector
。
答案 1 :(得分:3)
使用std::vector
(需要标题<vector>
):
int size;
cout<<"Enter desired size of the array";
cin >> size;
std::vector<int> array(size);
答案 2 :(得分:3)
#include <iostream>
int main() {
int size;
std::cout <<"Enter desired size of the array";
std::cin >> size;
int *array = new int[size];
}
如上文链接文章所述:
在大多数情况下,动态分配的内存仅在程序中的特定时间段内需要;一旦不再需要它,就可以释放它,以便内存再次可用于动态内存的其他请求。这是操作员删除的目的。
当您使用array
完成后,应使用以下语法将其删除:
delete[] array;
std::vector
#include <iostream>
#include <vector>
int main() {
int size;
std::cout <<"Enter desired size of the array";
std::cin >> size;
std::vector<int> array(size);
}