定义数组,然后改变它的大小

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::vectorstd::deque,则应该只使用指针。跨度> 我认为不使用java.util.Vector 的充分理由会转移并成为不使用std::vector 的充分理由。我现在正在尝试一个简单的答案。让我们看看情况如何。 @aib 不使用java.util.Vector 的简单原因就是这是一个C++ 问题。 Java 之于 C++ 就像蒲公英之于分号。 @wilhelmtell 什么? “我来自 Java 背景,我可以在 Java 中做一些我需要在 C++ 中做的事情,但我不知道该怎么做。......我 [原文如此] java 我会做类似的事情:. ..”

以上是关于定义数组,然后改变它的大小的主要内容,如果未能解决你的问题,请参考以下文章

Java数组的定义,声明,初始化和遍历

Java基础-7数组

数组

GEKKO:数组大小作为模型变量

std::vector

STL vector