定义数组,然后更改其大小 我来自java后台,我可以用java做一些我需要做的C++,但是我不知道怎么做。
我需要声明一个数组,但目前我不知道数组的大小。一旦知道了大小,就设置数组的大小。我会做一些类似的事情:定义数组,然后更改其大小 我来自java后台,我可以用java做一些我需要做的C++,但是我不知道怎么做。,c++,arrays,C++,Arrays,我需要声明一个数组,但目前我不知道数组的大小。一旦知道了大小,就设置数组的大小。我会做一些类似的事情: int [] array; 然后 我如何在C++中执行?声明指针: int * array; 在大多数情况下,您希望使用std::vector std::vector<int> array; array.resize(someSize); 没有C++运行时默认为垃圾回收,因此需要删除[]/COM>避免内存泄漏。你可以用智能指针类型获得两个世界最好的,但实际上,只使用 STD
int [] array;
然后
我如何在C++中执行?
声明指针:int * array;
在大多数情况下,您希望使用
std::vector
std::vector<int> array;
array.resize(someSize);
<>没有C++运行时默认为垃圾回收,因此需要<代码>删除[]/COM>避免内存泄漏。你可以用智能指针类型获得两个世界最好的,但实际上,只使用<代码> STD::向量< /> > .< /P> < P> C++,你可以做:
int *array; // declare a pointer of type int.
array = new int[someSize]; // dynamically allocate memory using new
一旦使用完内存,请使用delete as取消分配内存:
delete[]array;
最好的方法是使用
std::vector
。它做你想做的一切,并且易于使用和学习。此外,由于这是C++,所以应该使用<代码>向量而不是数组。对于为什么应该使用容器类(向量)而不是数组,这是一个很好的理由
向量的大小是动态的,可以根据您的需要而增长-这正是您想要的 确切答案是:
char * array = new char[64]; // 64-byte array
// New array
delete[] array;
array = new char[64];
然而,在大多数情况下,std::vector是一个更好的选择。它不需要手动删除和新命令即可完成所需操作。正如其他人所提到的,
std::vector
通常是一种方法。原因是vector非常容易理解,它在编译器和平台之间是标准化的,最重要的是,它使程序员免受手动管理内存的困难。此外,需要按顺序分配向量元素(即,向量元素A、B、C将以与推入向量相同的顺序出现在连续存储器中)。这将使向量与常规动态分配数组一样对缓存友好
虽然通过声明指向int的指针并手动管理内存肯定可以实现相同的最终结果,但这将意味着额外的工作:
void function()
{
int* array = new int[32];
char* somethingElse = new char[10];
// Do something useful.... No returns here, just one code path.
delete[] array;
delete[] somethingElse;
}
看起来很安全。但事实并非如此。如果在尝试为“somethingElse”分配10个字节时,系统内存不足怎么办?将抛出类型为
std::bad_alloc
的异常,该异常将开始展开堆栈以查找异常处理程序,并跳过函数末尾的delete语句。你有内存泄漏。这是避免在C++中手动管理内存的一个原因。为了解决这个问题(如果您真的非常想),该库提供了一系列漂亮的RAII包装器,例如and。在编译时知道大小时使用std::array,否则使用std::vector
#include <array>
constexpr int someSize = 10;
std::array<int, someSize> array;
#包括
constexpr int someSize=10;
std::数组;
或
#包括
std::矢量阵列//大小=0
array.resize(someSize)//大小
如果没有相当多的额外上下文,这不是一个非常有用的建议。这将是C语言的正确答案,但是C++中,如果你有一个不使用<代码> STD::向量或std::vector
与Java的Java.util.ArrayList
有很多共同之处。(也有不同之处,但相似性很强)这是正确的和有洞察力的,但实际上,应该鼓励在C++中使用<代码> STD::向量< /代码>。这就是容器的用途,从标准容器与RAII的良好配合等明显优势可以看出,在皮肤下std::vector
将此代码逐字节放入其中。通常,不使用标准容器的原因与模板的可用性、给定的非标准编译器等有关。我不会反对这个答案,不是因为它是错误的,而是因为它隐藏了许多重要的、相关的信息,你应该时刻注意这些信息代码>否则你会泄漏内存,这很危险。你只是还不知道大小,还是只有在运行时读了一些东西后才知道大小?即大小是否为编译时常量?在这种情况下,有比使用新的或向量更简单的方法来解决这个问题。从你接受的答案来看,你似乎认为std::vector
不适合你。为什么呢?
void function()
{
int* array = new int[32];
char* somethingElse = new char[10];
// Do something useful.... No returns here, just one code path.
delete[] array;
delete[] somethingElse;
}
#include <array>
constexpr int someSize = 10;
std::array<int, someSize> array;
#include <vector>
std::vector<int> array; //size = 0
array.resize(someSize); //size = someSize