附加现有数组

时间:2010-11-27 10:26:24

标签: java c++

我有一些关于数组的问题,我正在阅读一些关于Java的书,现在我正在阅读关于类StringBuilder的内容,我被告知这个类将我的字符串保存在具有当前容量的数组中,如果容量是还不够,这个类自动增加容量capacity = 2*(capacity + 1),当我学习c和c ++时,如果我的数组中没有足够的空间,我被教导做同样的事情,但what is the logic behind this statement?为什么可以我只是想知道我需要多少记忆然后再做capacity = capacity + homMuchDoINeed(),或者为什么不capacity = 4 * capacity,先谢谢你的回答

5 个答案:

答案 0 :(得分:2)

  

为什么我不能只知道我需要多少内存然后再做

     

capacity = capacity + homMuchDoINeed()

因为那时你需要为每次插入分配新的内存,所以单个插入需要线性时间,n次插入需要二次时间。另一方面,如果你以x2或x1.5之类的常数因子增长,则单个插入需要按照摊销的常数时间进行,n次插入需要线性时间。

Stephan T. Lavavej在多个视频中解释了这一点,例如this one

答案 1 :(得分:1)

自动增加只是一个经验法则,以尽量减少对象构建。

如果您知道将追加多少个元素,并且将来不再添加任何元素,最好明确指定大小以节省内存。在Java中,您可以使用:

  

Arrays.copyOf(oldArray,newSize)

如果您不确定不会再将更多元素附加到数组中,那么在java中您可以使用ArrayList,因为它使用此经验法则透明地处理调整大小:

  

int newCapacity =(oldCapacity * 3)/ 2 + 1;

答案 2 :(得分:0)

只需使用ArrayList

答案 3 :(得分:0)

capacity = C * (capacity + K)通常比capacity = capacity + K更好,因为您不必经常重新分配,capacity = C * capacity根本不可行(如果当前容量为0,会怎样?)。< / p>

但是,如果可能,我建议您使用standard containers

答案 4 :(得分:0)

如果您知道需要多少容量,则可以在启动时提供收集容量。加倍代码假设您不知道最终需要多少内存(或者至少不想担心它)