手动执行C ++向量

时间:2018-10-06 07:12:52

标签: c++ vector

我是编程和C ++的新手,在我的课程中,我需要手工执行一个程序,并演示元素如何变化以及哪些元素发生变化。我对此有些犹豫,但我认为我走在正确的轨道上。任何帮助将不胜感激。

void data(vector<double> &data, int idx, double value)
{
  data.push_back(value);

  if (idx >= data.size() - 1) return;
  if (idx < 0) idx = 0;

  for(int i = data.size() - 1; i > idx; i--)
  {
    data[i] = data[i -1];
    data[i - 1] = value;
  }

}

我正在使用的数据集是:

[4, -6, 0, 8, -7]
idx: 2
value: -7

所以-7的值就是向量末尾的push_back

我想我已经弄清楚了,data.size() - 1表示数组中的最后一个元素,如果idx大于或等于最后一个元素,则返回该值? for循环似乎向后迭代。

2 个答案:

答案 0 :(得分:1)

如果您的问题是弄清楚该算法的目的,请阅读此答案。

让我们首先举个例子:

std::vector<double> a{ 4, -6, 0, 8, -7 };
data(a, 2, -7);

结果是:4, -6, -7, 0, 8, -7

应该清楚,data(vec, idx, val)val插入到vec中,因此它是第idx 个元素和{{1 }}将其大小增加了1。 如果vec超出范围,则将其调整为0(如果idx)或< 0(如果vec.size()。)

编辑:

可视化:

最初: >= vec.size()

第一次迭代4, -6, 0, 8, -7, -7
I = data.size() - 1 = 54, -6, 0, 8, -7, -7
data[5] = data[4]4, -6, 0, 8, -7, -7

(注意:这里data[4] = value,所以什么都没有改变)

第二次迭代-7 = -7
I = 44, -6, 0, 8, 8, -7
data[4] = data[3]4, -6, 0, -7, 8, -7

第三次迭代data[3] = value
I = 34, -6, 0, 0, 8, -7
data[3] = data[2]4, -6, -7, 0, 8, -7

现在data[2] = value,结束。

答案 1 :(得分:0)

if (idx >= data.size() - 1) return;

实际上,您检查索引是否不在数组之外。 data.size() - 1是最后一个元素,因此idx最多可以是倒数第二个元素。我们会明白为什么会这样。

if (idx < 0) idx = 0;

如果索引小于0,只需将其设置为0即可访问第一个元素

for(int i = data.size() - 1; i > idx; i--)

您从最后一个元素的索引开始,并且只要它大于idx,就可以继续进行另一个迭代(并将其递减)。因此,在您的示例中,您将进行两次迭代,其中i = 4和i =3。idx就像是一个较低的互斥边界

data[i] = data[i -1];
data[i - 1] = value;

您首先将前一个元素复制到当前元素,然后将值(在您的情况下为-7)复制到前一个元素。因此,在上一次迭代中,i-1与idx相同。并且由于idx不能成为最后一个元素,因此循环将不会进入。

所以这实际上是在从向量的末端到位置idx逐步插入值。最后一个元素丢失,其他元素向上滑动一个位置。每次迭代都会在左侧再增加一个位置,然后再向上移动。