假设我在第{i}个位置插入p个新元素,大小为'{1}}。
由于std::vector<mytype>
中的项目可以保证为其元素使用连续的存储位置,因此看起来这需要我执行上述操作的4个步骤:
1)如果我们空间不足,可能会重新分配矢量,基本上会使其大小加倍。但这是一个恒定的时间操作(虽然是一个非常大的操作)。
2)接下来,从旧向量到新向量的索引0到i-1之间存在元素的memcpy。
3)然后你复制'p'在第i个索引插入的新项目。
4)然后从i + 1到n索引的所有项目的另一个memcpy从旧向量到新向量。
以上是不是所有的恒定时间操作?那么不应该插入自己的恒定时间操作?那么为什么std::vector
在插入的元素数量(复制/移动构造)加上位置(移动)之后的元素数量上是线性的?
答案 0 :(得分:8)
以上是不是所有的恒定时间操作?
不,memcpy
和memmove
的时间复杂度与正在复制或移动的块的大小呈线性关系,因为要移动的每个k
字节都需要准确触及一旦。要移动的块的大小为sizeof(T) * N
,使得时序也是线性的。
即使在向量末尾添加元素也具有线性复杂性,因为在重新分配时复制数据(但是,向量末尾添加N
元素具有分摊线性复杂度,转化为按项目复杂的摊销常数)。