手动执行C++向量



我是编程和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。最后一个元素丢失,其他元素向上滑动一个位置。每次迭代它都会向左多一个位置,之前的位置就会增加。

最新更新