在C语言中,我会使用 realloc
来完成这个任务。
在C++中,通常会考虑使用STL的 vector
类。
但如果不使用以上解决方案,如何正确地调整C++数组的大小呢?
在C++中没有realloc
的好等价物。您需要手动复制数组并将旧元素复制过去。幸运的是,由于<algorithm>
中的std::copy
函数,这并不太难:
size_t k = /* ... */
T* buffer = /* .. get old buffer of size k. .. */
T* newBuffer = new T[newSize]; // Assume newSize >= k
std::copy(buffer, buffer + k, newBuffer);
delete [] buffer;
buffer = newBuffer;
realloc
的很好的等价物。” C++包含(大部分)C标准库,其中包括realloc
函数。 - Cheers and hth. - Alfrealloc
只适用于 POD 类型。如果您尝试对 string
、vector
等数组进行 realloc
,结果将是未定义的。我可能应该说没有好的通用替代方案可以取代 realloc
。 - templatetypedefint* arr = new int[20];
...
//wanna resize to 25?
int* temp = new int[25];
std::copy(arr, arr+20, temp);
delete [] arr;
arr = temp;
... //now arr has 25 elements
但是,当然,你不应该这样做 :)
如果你坚持要在C++中自己完成这个任务,你可能想要像std::vector
一样粗略地分配原始内存,使用全局new运算符,然后使用放置new在原地创建对象。
否则,你最终会在你分配的所有内存中构造对象,然后在使用它们时对它们进行赋值。除非你知道初始(默认)对象构造是轻量级的,否则你最好尽可能避免它。