插入STL载体

时间:2012-05-03 08:24:00

标签: c++

使用C ++ STL向量,我们正在构建N个元素的向量,对于某些元素 我们选择将它们插入向量前面的原因。向量前面的每个元素插入都会强制所有现有元素的移位为1.这会导致向量元素的(1 + 2 + 3 + ... + N)整体移位,即(N / 2)(N +1)轮班。

我的问题是作者是如何带来的(1 + 2 + 3 + ... N),我认为它应该是1 + 1 + 1..N,因为我们在一个位置移动一个元素以获得空开始?

谢谢!

3 个答案:

答案 0 :(得分:4)

来自[vector.modifiers]/2(描述vector::insert):

  

复杂性:插入的元素数量加上到向量末尾的距离是复杂的。

每次添加元素时,向量末尾的距离都会增加1。

第一次添加元素时,插入1,距离末尾的距离为0,因此复杂度为1 + 0 = 1.第二次插入1,并且到终点的距离是1,所以复杂度是1 + 1 = 2.第三次,到终点的距离是2,所以复杂度是1 + 2 = 3.这就是创造1 + 2 + 3 +的原因...... +作者描述的N模式。

答案 1 :(得分:1)

在插入n时,向量中当前有n个元素需要移位。

vector<int> values;
for (size_t i = 0; i < N; ++i)
{
     //At this point there are `i` elements in the vector that need to be moved
     //to make room for the new element
     values.insert(values.begin(), 0); 
}

答案 2 :(得分:0)

第一个值被移动N-1次,每次插入新值时它必须移动。第二个值移动N-2次,因为在它之后仅添加N-2个值。下一个值移动N-3,依此类推。最后一个值没有移动。

我不知道为什么作者会谈论N而不是N-1。但是你混淆的原因是,作者计算单个值的变化,并计算涉及多个单一值变化的变换预测量。