我是编程和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 循环似乎向后迭代到我。
如果你的问题是弄清楚这个算法的目的,请阅读这个答案。
让我们先举个例子:
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
个元素,并且vec
将其大小增加了 1。 如果idx
超出范围,则将其调整为 0(如果< 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
(
现在I = 2
,结束了。
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。最后一个元素丢失,其他元素向上滑动一个位置。每次迭代它都会向左多一个位置,之前的位置就会增加。