【发布时间】:2015-02-20 09:23:04
【问题描述】:
我想知道我们是否可以创建一个用户指定大小的数组。
例如:
int a;
cout<<"Enter desired size of the array";
cin>>a;
int array[a];
上述程序无法运行,因为数组大小必须是编译时常量,但在我的情况下,它是一个变量。
是否可以将变量变为常量并将其分配为数组的大小?
【问题讨论】:
我想知道我们是否可以创建一个用户指定大小的数组。
例如:
int a;
cout<<"Enter desired size of the array";
cin>>a;
int array[a];
上述程序无法运行,因为数组大小必须是编译时常量,但在我的情况下,它是一个变量。
是否可以将变量变为常量并将其分配为数组的大小?
【问题讨论】:
在 C++ 中,有两种存储类型:基于 stack 的内存和基于 heap 的内存。基于堆栈的内存中对象的大小必须是静态的(即不改变),因此必须在编译时知道。这意味着您可以这样做:
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。
【讨论】:
int size; // set size at runtime int* array = new int[size] 不适合我。我正是这样做的,但它是一个二维数组。说值 n 必须是一个常数。我的代码:int n; cin >> n; float* matrixA = new float[n][n]; 将 int n 更改为 const int n 时,我得到完全相同的消息。有什么想法吗?
new 和delete 在堆上分配一个数组没有std::vector 引入的开销。
使用std::vector(需要标头<vector>):
int size;
cout<<"Enter desired size of the array";
cin >> size;
std::vector<int> array(size);
【讨论】:
vector 类在底层实现为数组。
#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);
}
【讨论】:
new分配内存时,它必须被删除以防止内存泄漏