定义数组,然后改变它的大小
Posted
技术标签:
【中文标题】定义数组,然后改变它的大小【英文标题】:Define array, then change its size 【发布时间】:2010-10-03 19:07:05 【问题描述】:我来自 java 背景,我可以在 Java 中做一些我需要在 C++ 中做的事情,但我不知道该怎么做。
我需要声明一个数组,但目前我不知道大小。一旦我知道大小,然后我设置数组的大小。我 java 我只会做类似的事情:
int [] array;
然后
array = new int[someSize];
如何在 C++ 中做到这一点?
【问题讨论】:
您只是还不知道大小,还是只有在运行时阅读某些内容后才知道大小? IE。大小是编译时间常数吗?在这种情况下,有比使用 new 或向量更简单的方法来解决这个问题。 我从您接受的答案中看到,您似乎认为std::vector
不适合您。这是为什么呢?
【参考方案1】:
您想在大多数情况下使用std::vector
。
std::vector<int> array;
array.resize(someSize);
但是如果你坚持使用new
,那么你必须比在Java 中做更多的工作。
int *array;
array = new int[someSize];
// then, later when you're done with array
delete [] array;
默认情况下,没有 c++ 运行时附带垃圾收集,因此需要 delete[]
以避免内存泄漏。使用智能指针类型可以两全其美,但实际上,只需使用std::vector
。
【讨论】:
噗。令人惊讶的是,SO-izens 的行为与我们一样好。 +1。 C++ 的std::vector
与Java 的java.util.ArrayList
有很多共同之处。 (也有差异,但相似性很强。)【参考方案2】:
在 C++ 中你可以这样做:
int *array; // declare a pointer of type int.
array = new int[someSize]; // dynamically allocate memory using new
一旦你使用完内存......使用 delete as 取消分配它:
delete[]array;
【讨论】:
这是正确且有见地的,但实际上,应该鼓励在 C++ 中使用std::vector
。这就是容器的用途,除了标准容器与 RAII 配合良好的明显优势等等之外,在std::vector
的皮肤下,这个代码在字节对字节的内部都有。通常不使用标准容器的原因与模板的可用性、给定的非标准编译器等有关。我不会赞成这个答案,不是因为它是错误的,而是因为它隐藏了许多重要的相关信息,您应该始终注意这些信息。
delete[] array;
很重要,否则会泄漏内存,很危险【参考方案3】:
最好的方法是使用std::vector
。它可以满足您的所有需求,并且易于使用和学习。此外,由于这是 C++,您应该使用 vector
而不是数组。 Here 是您应该使用容器类(向量)而不是数组的绝佳理由。
向量的大小是动态的,并且会随着您的需要而增长 - 正是您想要的。
【讨论】:
【参考方案4】:确切答案:
char * array = new char[64]; // 64-byte array
// New array
delete[] array;
array = new char[64];
std::vector
在大多数情况下是更好的选择。它可以满足您的需要,无需手动删除和新建命令。
【讨论】:
【参考方案5】:正如其他人所提到的,std::vector
通常是要走的路。原因是向量很好理解,它在编译器和平台之间是标准化的,最重要的是它使程序员免于手动管理内存的困难。此外,向量元素需要按顺序分配(即向量元素 A、B、C 将按照它们被推入向量的顺序出现在连续内存中)。这应该使向量与常规动态分配的数组一样对缓存友好。
虽然通过声明一个指向 int 的指针并手动管理内存肯定可以实现相同的最终结果,但这意味着额外的工作:
-
每次需要更多内存时,都必须手动分配
在为指针分配新值之前,您必须非常小心地删除任何以前分配的内存,以免您遇到巨大的内存泄漏问题
与std::vector
不同,这种方法对RAII 不友好。考虑以下示例:
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
类型的异常,这将开始展开堆栈以寻找异常处理程序,跳过函数末尾的删除语句。你有内存泄漏。这只是避免在 C++ 中手动管理内存的众多原因之一。为了解决这个问题(如果您真的非常想这样做),Boost 库提供了一堆不错的 RAII 包装器,例如 scoped_array 和 scoped_ptr。
【讨论】:
【参考方案6】:在编译时知道大小时使用 std::array 否则使用 std::vector
#include <array>
constexpr int someSize = 10;
std::array<int, someSize> array;
或
#include <vector>
std::vector<int> array; //size = 0
array.resize(someSize); //size = someSize
【讨论】:
【参考方案7】:声明一个指针:
int * array;
【讨论】:
如果没有额外的上下文,这不是一个很有帮助的建议。 这将是 C 中正确答案的(开始),但在 C++ 中,如果您有充分的理由不使用std::vector
或 std::deque
,则应该只使用指针。跨度>
我认为不使用java.util.Vector
的充分理由会转移并成为不使用std::vector
的充分理由。我现在正在尝试一个简单的答案。让我们看看情况如何。
@aib 不使用java.util.Vector
的简单原因就是这是一个C++ 问题。 Java 之于 C++ 就像蒲公英之于分号。
@wilhelmtell 什么? “我来自 Java 背景,我可以在 Java 中做一些我需要在 C++ 中做的事情,但我不知道该怎么做。......我 [原文如此] java 我会做类似的事情:. ..”以上是关于定义数组,然后改变它的大小的主要内容,如果未能解决你的问题,请参考以下文章