如何在C++中动态扩展数组?{喜欢在矢量}

13 c++ arrays expand dynamic

可以说,我有

int *p;
p = new int[5];
for(int i=0;i<5;i++)
   *(p+i)=i;
Run Code Online (Sandbox Code Playgroud)

现在我想在数组中添加第6个元素.我该怎么做?

Kim*_*man 26

您必须重新分配数组并复制数据:

int *p;
p = new int[5];
for(int i=0;i<5;i++)
   *(p+i)=i;

// realloc
int* temp = new int[6];
std::copy(p, p + 5, temp); // Suggested by comments from Nick and Bojan
delete [] p;
p = temp;
Run Code Online (Sandbox Code Playgroud)

  • 由于匿名用户拒绝编辑,此问题已修复。感谢您发现该错误!当我在不检查参数顺序的情况下从 memcpy 更改为 std::copy 时,它就溜进来了。http://stackoverflow.com/review/suggested-edits/1775715 &lt;-- 这应该被接受! (4认同)
  • 这对于 'int' 类型很好,但对于用户定义的类型,`memcpy/delete []` 方法可能会导致问题。 (2认同)
  • 您可以使用 std::copy 而不是 memcpy - 它适用于 POD 以及具有用户定义赋值运算符的对象,并且它很可能针对整数类型优化为 memcpy。然而,优化是一个实施质量问题。 (2认同)
  • @JeremyTrifilo 该问题是针对用户定义的类型提出的。如果您有一个带有用户定义赋值运算符的对象数组(例如,它们需要释放/分配私有内存),`memcpy` 将中断,因为它只是 blit 字节而不是为每个元素调用赋值。 (2认同)

Cra*_*rks 8

你不能.您必须使用动态容器,例如STL向量.否则,您可以创建另一个更大的数组,然后将第一个数组中的数据复制到其中.

原因是数组表示内存中的连续区域.对于上面的示例,假设p指向地址0x1000,并且五个int对应于20个字节,因此数组在0x1014的边界处结束.编译器可以自由地将其他变量放在内存中,从0x1014开始; 例如,int i可能占用0x1014..0x1018.如果你然后扩展了数组,使它占用了四个字节,会发生什么?


Meh*_*ari 3

如果您使用分配初始缓冲区,malloc则可以使用它realloc来调整缓冲区大小。您不应该使用realloc调整new-ed 缓冲区的大小。

int * array = (int*)malloc(sizeof(int) * arrayLength);
array = (int*)realloc(array, sizeof(int) * newLength);
Run Code Online (Sandbox Code Playgroud)

然而,这是一种 C 风格的做事方式。您应该考虑使用vector.

  • 仅适用于普通旧数据类型。 (2认同)