假设我有
int *p;
p = new int[5];
for(int i=0;i<5;i++)
*(p+i)=i;
现在我想要向数组中添加第六个元素。我该怎么做?
你需要重新分配数组并复制数据:
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;
memcpy
将会失效,因为它仅仅复制字节而不是调用每个元素的赋值函数。 - Kim Gräsman无法这样做。您必须使用动态容器,例如STL向量(vector),才能实现此功能。或者您可以创建另一个较大的数组,然后将第一个数组中的数据复制到其中。
原因在于,数组表示内存中连续的区域。对于上面的示例,假设p指向地址0x1000,五个整数对应二十个字节,因此数组结束于0x1014的边界处。编译器可以自由地将其他变量放置在从0x1014开始的内存中;例如,int i可能占用0x1014..0x1018。如果您将数组扩展到占用四个以上的字节,会发生什么呢?
如果你使用malloc
来分配初始缓冲区,那么可以使用realloc
来调整缓冲区的大小。但是不应该使用realloc
来调整一个new
分配的缓冲区的大小。
int * array = (int*)malloc(sizeof(int) * arrayLength);
array = (int*)realloc(array, sizeof(int) * newLength);
然而,这是一种类似于C语言的做法。你应该考虑使用 vector
。
和其他人说的一样,但如果您经常调整数组大小,则一种策略是每次将数组大小加倍。不断创建新的并销毁旧的会产生成本,因此加倍理论试图通过确保未来元素有足够的空间来缓解这个问题。
std::vector
。如果你不使用std::vector
,那么你应该对C++有足够的了解(因为你问了这个问题,可能还不够),并且你应该有一个非常好的理由。根据这个理由,答案可能会有所不同。 - sbi