为什么我的向量中的项目在C ++中的for-each循环期间不会发生变化?

时间:2014-02-04 01:08:21

标签: c++ for-loop vector

我是C ++的新手,通常是Java代码。我很难理解C ++中的容器是如何与我在Java中使用的相同和不同。

对于我现在正在做的项目,我已经建立了自己的数据结构,称为solar_body。其中每个都包含名称,质量,半径和3个数据结构,称为position_t,velocity_t和acceleration_t。希望这些名字是不言自明的。

我正在使用向量来保存程序中solar_body对象的集合。我似乎发现了一个问题,使用了我从Java中知道的for-each循环,希望有人可以解释发生了什么。

我在向量上运行一个循环,调用每个对象上的update方法(solar_body.update())。这将根据该迭代的当前加速度计算新的速度和位置。当我第一次设置它时,我就这样做了for循环:

for (solar_body body: bodies) {
  body.update(); }

当我这样做并打印变量时,速度和位置会更新。但是,在我的下一个while循环迭代期间,新值将消失,并且它们将返回到相同的旧值。似乎for-each循环在solar_body对象的副本上运行,而不是原始对象。

出于好奇,我把我的for循环改为:

for (int i=0; i<bodies.size(); i++) {
  bodies.at(i).update(); }

这就像我预期的那样奏效。在Java中,使用这两个循环的实践确实没有区别。在这种情况下发生了什么,我不明白?

提前感谢您的帮助。

1 个答案:

答案 0 :(得分:7)

for (solar_body body : bodies)

按值迭代;也就是说,它会创建bodies元素的副本,并在迭代期间将其放在body中。然后它继续下一个元素,依此类推。要通过引用进行迭代,以便您可以修改元素,您需要以下内容:

for (solar_body& body : bodies)