动态数组的实现是否在开始时保留空间,用于预先添加?

时间:2014-08-26 19:34:37

标签: c++ arrays dynamic-arrays prepend

dynamic arrays的基本实现是2n大小,其中一半空间由现有元素填充,另一半保留在末尾用于在O中追加新元素(1 ) 时间。

在数组末尾以外的任何位置插入新元素需要重新分配数组,这是一项昂贵的操作。

是否有可调整大小数组的C ++实现,其中空间也保留在数组的开头,以便有效地预先添加元素?如果是这样,与末尾保留的空间相比,预留了多少空间用于追加?我认为prepending是一种不那么常见的操作,但是如果它在程序中经常发生,那么重新分配每个前置操作可能是毁灭性的。

2 个答案:

答案 0 :(得分:3)

Deques允许在摊还的常数时间内预先计算和附加。

vectors不同,数组连续存储并在达到容量时重新分配,不能保证deque元素连续存储。相反,deques将元素存储在块中。如果push_back()push_front()调用需要更多空间,则会分配并链接到新的空间块。

感谢Mark Ransom在评论中发布有关deques的内容。

答案 1 :(得分:1)

我没有听说过任何此类实施。但是,如果您不需要在内存中按顺序对元素进行排序,则可以使用std :: list并在任何位置插入O(1)。