更好的方法来动态地增加C ++中数组的大小

时间:2013-01-04 20:27:32

标签: c++ arrays realloc

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

4 个答案:

答案 0 :(得分:2)

使用malloc(非新)分配块,然后使用realloc。 realloc知道扩展块后有多少可用空间。

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

我见过的大多数代码都没有正确处理realloc的失败。

答案 1 :(得分:1)

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

考虑切换到std :: vector和std :: string。

答案 2 :(得分:1)

我认为你从C的角度思考整个问题。

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

e.g。

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

答案 3 :(得分:1)

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

但是,如果在每次重新分配时将数组的大小加倍(或将其大小乘以常数&gt; 1),则“将数组增加1”操作平均使用常量时间。搜索Constant Amortized Time

假设一个初始大小为n的数组。重新分配到新的大小2n并复制成本2n步,但下一个n“增加”操作是免费的。

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