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

bal*_*erc 8 c++ stl

假设我在'i'位置插入p个新元素std::vector<mytype>,大小为'n'.

由于物品std::vector保证为其元素使用连续的存储位置,看起来我需要4步才能完成上述操作:

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

2)接下来是从旧向量到新向量的索引0到i-1的元素的memcpy.

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

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

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

das*_*ght 8

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

不,时间复杂度memcpymemmove被复制或移动的块的大小是线性的,因为每个k被移动的字节需要被触摸一次.正在移动的块的大小也sizeof(T) * N使得时序也是线性的.

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

  • 你的意思是,摊销*常数*复杂性.此外,为非平凡复杂类型纠正OP将是一个很好的接触. (2认同)