C++ C++;:使用用户输入的大小创建数组

C++ C++;:使用用户输入的大小创建数组,c++,arrays,C++,Arrays,我想知道我们是否可以制作一个由用户指定大小的数组 例: inta; 库塔; int数组[a]; 上面的程序不能工作,因为数组大小必须是编译时常量,但在我的例子中,它是一个变量 是否可以将变量转换为常量并将其指定为数组大小?使用std::vector(需要标题): int大小; cout大小; std::向量数组(大小); 使用动态分配 使用std::vector #包括 #包括 int main(){ 整数大小; 标准:cout大小; std::向量数组(大小); } 在C++中,有两种类

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

例:

inta;
库塔;
int数组[a];
上面的程序不能工作,因为数组大小必须是编译时常量,但在我的例子中,它是一个变量


是否可以将变量转换为常量并将其指定为数组大小?

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

int大小;
cout大小;
std::向量数组(大小);
使用动态分配

使用
std::vector

#包括
#包括
int main(){
整数大小;
标准:cout大小;
std::向量数组(大小);
}

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

int array[10]; // fine, size of array known to be 10 at compile time
int i;
// set i at runtime
const int size = i;
int array[size]; // error, size not known at compile time
int size;
// set size at runtime
std::vector<int> vec(size); // fine, size of vector can be set at runtime
但不是这个:

int size;
// set size at runtime
int array[size]; // error, what is the size of array?
请注意,常量值和编译时已知的值之间存在差异,这意味着您甚至不能这样做:

int array[10]; // fine, size of array known to be 10 at compile time
int i;
// set i at runtime
const int size = i;
int array[size]; // error, size not known at compile time
int size;
// set size at runtime
std::vector<int> vec(size); // fine, size of vector can be set at runtime
如果您想要一个动态大小的对象,可以使用某种形式的
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;
这是一种痛苦,因为您必须记住
删除
使用
new
创建的所有内容(并且只删除
一次)。幸运的是,C++有很多数据结构可以为您做这些操作(即,它们使用<代码>新< /COD>和Dele> <代码> >动态地改变对象的大小)。
std::vector
是这些自我管理数据结构的一个示例,它直接替代了数组。这意味着您可以这样做:

int array[10]; // fine, size of array known to be 10 at compile time
int i;
// set i at runtime
const int size = i;
int array[size]; // error, size not known at compile time
int size;
// set size at runtime
std::vector<int> vec(size); // fine, size of vector can be set at runtime

总结:不要使用数组,除非你知道编译时的大小(在这种情况下,不要使用<代码>新< /C++ >,而是使用<代码> STD::vector < /COD>。< /P>正如我所说,我是C++的新手。你能提供一个简短的解释吗?谢谢:)你可以看看这些文档或。但是这不是在创建一个向量而不是一个数组吗?@MohitBhasi
vector
类被实现为一个隐藏的数组。@Algo;幸运的是,在这种情况下,这是完全不相关的。如果您要向初学者演示如何动态分配数组,那么只有再次演示如何删除它才是公平的。不要让它看起来比实际更简单。这就是上面链接的目的,但是为什么要提供一个自包含的示例来演示糟糕的做法呢?@algothx很多!不知道任何abt向量,所以第一个选项帮助我理解了一个新的concept@ChrisDrew好的,所以对于向量,没有内存泄漏的问题,但是当使用
new
分配内存时,必须将其删除以防止内存泄漏
int size;//运行时设置大小int*array=new int[size]
对我不起作用。我确实这样做了,但这是一个二维浮点数数组。表示值n必须是常数。我的代码:
intn;cin>>n;浮点*矩阵=新浮点[n][n]将int n更改为const int n时,我得到了完全相同的消息。有什么想法吗?啊,nvm想出来了。我必须使用这种语法制作一维数组,然后在每个数组中添加新的float[n]进行迭代。答案非常清楚,但我不同意上一句话,在很多情况下,您需要使用
new
delete
在堆上分配数组,而不需要
std::vector
带来的开销。