我是编程和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循环似乎向后迭代。
答案 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 = 5
(4, -6, 0, 8, -7, -7
)
data[5] = data[4]
(4, -6, 0, 8, -7, -7
)
(注意:这里data[4] = value
,所以什么都没有改变)
第二次迭代-7 = -7
:
I = 4
(4, -6, 0, 8, 8, -7
)
data[4] = data[3]
(4, -6, 0, -7, 8, -7
)
第三次迭代data[3] = value
:
I = 3
(4, -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逐步插入值。最后一个元素丢失,其他元素向上滑动一个位置。每次迭代都会在左侧再增加一个位置,然后再向上移动。