为什么std :: vector :: insert复杂度是线性的(而不是常量)?

时间:2014-08-09 13:06:46

标签: c++ stl

假设我在第{i}个位置插入p个新元素,大小为'{1}}。

由于std::vector<mytype>中的项目可以保证为其元素使用连续的存储位置,因此看起来这需要我执行上述操作的4个步骤:

1)如果我们空间不足,可能会重新分配矢量,基本上会使其大小加倍。但这是一个恒定的时间操作(虽然是一个非常大的操作)。

2)接下来,从旧向量到新向量的索引0到i-1之间存在元素的memcpy。

3)然后你复制'p'在第i个索引插入的新项目。

4)然后从i + 1到n索引的所有项目的另一个memcpy从旧向量到新向量。

以上是不是所有的恒定时间操作?那么不应该插入自己的恒定时间操作?那么为什么std::vector在插入的元素数量(复制/移动构造)加上位置(移动)之后的元素数量上是线性的?

1 个答案:

答案 0 :(得分:8)

  

以上是不是所有的恒定时间操作?

不,memcpymemmove的时间复杂度与正在复制或移动的块的大小呈线性关系,因为要移动的每个k字节都需要准确触及一旦。要移动的块的大小为sizeof(T) * N,使得时序也是线性的。

即使在向量末尾添加元素也具有线性复杂性,因为在重新分配时复制数据(但是,向量末尾添加N元素具有分摊线性复杂度,转化为按项目复杂的摊销常数)。