手动执行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; } }
所以手动执行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; } },c++,vector,C++,Vector,所以-7值就是推回到向量末端的值 我想我已经找到了其中的一些,data.size()-1表示数组中的最后一个元素,如果idx大于或等于最后一个元素,则返回该值?对于我来说,for循环似乎是反向迭代的。如果您的问题是要找出此算法的目的,请阅读此答案 让我们首先以您的例子: std::vector<double> a{ 4, -6, 0, 8, -7 }; data(a, 2, -7); std::向量a{4,-6,0,8,-7}; 数据(a,2,-7); 结果是:4、-6、-7、0
-7
值就是推回到向量末端的值
我想我已经找到了其中的一些,data.size()-1
表示数组中的最后一个元素,如果idx
大于或等于最后一个元素,则返回该值?对于我来说,for循环似乎是反向迭代的。如果您的问题是要找出此算法的目的,请阅读此答案
让我们首先以您的例子:
std::vector<double> a{ 4, -6, 0, 8, -7 };
data(a, 2, -7);
std::向量a{4,-6,0,8,-7};
数据(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
(数据[4]=值
)
(注意:此处-7=-7
因此没有任何变化)
第二次迭代I=4
:
4、-6、0、8、8、-7
(data[4]=data[3]
)
4、-6、0、-7、8、-7
(数据[3]=值
)
第三次迭代I=3
:
4、-6、0、0、8、-7
(data[3]=data[2]
)
4、-6、-7、0、8、-7
(数据[2]=值
)
现在I=2
,完毕
if (idx >= data.size() - 1) return;
实际上,检查索引是否不在数组之外data.size()-1
是最后一个元素,因此idx最多可以是第二个最后一个元素。我们将看到这是为什么
if (idx < 0) idx = 0;
从最后一个元素的索引开始,只要它大于idx,就可以继续进行另一次迭代(并减小它)。所以在你的例子中,你会有两次迭代,i=4和i=3。idx就像一个排他的下限
data[i] = data[i -1];
data[i - 1] = value;
首先将上一个元素复制到当前元素,然后将值(-7)复制到上一个元素。因此,在最后一次迭代中,i-1将与idx相同。因为idx不能是最后一个元素,因为这样循环就不会进入
这实际上是一步一步地从向量的末端插入值到位置idx。最后一个元素丢失,其他元素向上滑动一个位置。每一次迭代,它都会在左边多出一个位置,之前的位置也会增加。如果我的英语不好,很抱歉,但我不明白你的问题是什么。请你解释一下好吗?当然可以,基本上是用我给出的向量值。我需要直观地显示元素是如何变化的,但不是通过程序。在纸上,我正在手动尝试计算迭代。如果我能理解程序的工作原理,我就可以把它写在纸上。这就是我遇到的问题。谢谢。还要注意,这是低效的。data[i]=data[i-1]
取消数据[i-1]=值
在上一次迭代中。Read恢复了我的否决票。因为答案需要一些解释,正如OP所期待的。现在看起来不错+谢谢你的帮助,我会给手工执行更多的练习来更好地理解算法。不幸的是,这是我的导师给我们的一个解决方案。这是有点混乱,因为导师正在使用自己的SDK与C++和语法是非常不同的C++我以前见过。
for(int i = data.size() - 1; i > idx; i--)
data[i] = data[i -1];
data[i - 1] = value;