在c++中动态增加数组大小的更好方法

Better method to increase the size of an array in C++ dynamically

本文关键字:更好 方法 数组 增加数 c++ 动态 增加      更新时间:2023-10-16

假设我有一个分配了new的字符数组。现在,如果我想修改数组的大小,那么下面两种方法中哪一种是最好的?1. 使用realloc函数OR2.分配一个新数组,将旧数组中的数据复制到新数组中,然后删除旧数组

使用malloc(不是new)分配块,然后使用realloc。Realloc知道块之后有多少可用空间可供扩展。

s2 = realloc(s,<size>);
if (s2) {
   s = s2;
}
else {
   free up s and handle the error
}

我看到的大多数代码都不能正确处理realloc的失败

您不能移植地将realloc应用于用new分配的缓冲区。因此,只有第二个选择是可行的。

考虑转换为std::vector和std::string

我想你是从C语言的角度考虑整个问题的。

如果您正在处理使用vector的数组,则它是动态的,并且避免了您在问题

中所述的问题。

vector v(10); // allocates an array of 10 initialized to 0
v.push_back(42); // added another, so now array is 11 long

第一个选项还意味着如果realloc发现块后没有足够的可用空间,则进行复制。(即使您使用malloc来分配数组,这是使用realloc的唯一正确选项。)

但是,如果在每次重新分配时将数组的大小增加一倍(或将其大小乘以一个> 1的常数),则"将数组增加1"操作平均使用常数时间。搜索常数平摊时间。

假设一个初始大小为n的数组。重新分配到新的大小为2n的数组并复制需要2n步,但接下来的n次"增加"操作是免费的。

顺便说一下,这就是std::vector和许多其他数组容器的内部实现方式。