将元素添加到数组中

时间:2011-02-25 12:48:58

标签: c++ arrays

如何将数组添加到数组大小未知且禁止向量的数组中?

4 个答案:

答案 0 :(得分:2)

如果数组的大小未知,您如何知道该元素的放置位置以及它是否合适?

无论如何,如果它不适合你必须分配一个足够大的新数组。

如果您最初使用malloc而不是new []进行分配,则可以使用realloc。您可能会惊讶地发现malloc / realloc没有被new替换,但是用于不同的目的,在这种情况下使用它是有用的。然后,您可以使用placement new将对象插入到已分配的内存中,vector会以这种方式工作。 (allocator用于实际分配内存,但有一个类似malloc的接口,虽然实现由库作者决定,但几乎肯定会使用malloc)。

如果使用realloc重新分配,则需要知道:

  • 将复制任何内存。请注意,如果它们是非POD对象存储,那么只进行逐字节复制是不安全的

  • 如果realloc失败,则返回NULL,并且不会释放先前的数组。在确定realloc工作之前,请务必保留指向旧位置的指针。

  • 如果您的数组不是POD,则无法重新分配,因此将新内存malloc并使用placement-new和copy-constructor,然后在释放它之前调用旧内存的每个对象上的析构函数。

  • 使用了Placement new,因此您可以分配比现在更多的内存,即比您拥有的内容更多。这可以防止您每次追加时都必须完成此过程。

  • 我已经解释了如何实现矢量,但这对你来说可能太复杂了,也可能对你的导师来说太复杂了。因此,只需创建一个带有new []的数组并复制元素,尽管如果每次添加时都必须这样做,效率非常低。

答案 1 :(得分:1)

您为此目的使用列表。数组不应该被扩展。

答案 2 :(得分:1)

你的问题没有意义。如果你不能使用vector,意味着这是一个赋值。我假设您必须使用本机数组。 如果您不知道尺寸,则无法添加元素 。如果您知道大小,则必须分配更大的数组,复制旧数组的内容和新元素。矢量实际上为你做了哪些:)

答案 3 :(得分:1)

在不知道数组的当前大小和数组的容量(区别很重要)的情况下,向数组添加元素是危险的。您永远不会知道何时传递了数组的边界(至少在程序因缓冲区溢出错误而崩溃之前)。

如果您的教授已禁止vector作业,他很可能会向您展示如何管理记忆。他正在寻找你使用new创建数组并正确识别何时需要分配更大尺寸的新数组,复制原始元素,并使用delete解除分配原始数组。

大多数教授没有提及的一个提示:当您使用new []分配数组时,您还必须使用delete []解除分配。