c++ - 为什么在 C++ 中的 for-each 循环期间我的 vector 中的项目不会改变?

标签 c++ for-loop vector

我是 C++ 的新手,通常使用 Java 编写代码。我很难理解 C++ 中的容器与我在 Java 中习惯使用的容器有何相同和不同之处。

对于我现在正在进行的项目,我制作了自己的数据结构,称为 solar_body。其中每一个都包含一个名称、质量、半径和我制作的 3 个数据结构,称为 position_t、velocity_t 和 acceleration_t。希望这些名称是不言自明的。

我在我的程序中使用 vector 来保存 solar_body 对象的集合。我似乎在使用我从 Java 了解到的 for-each 循环时发现了一个问题,希望有人能解释发生了什么。

我在 vector 中运行一个循环,在每个对象上调用更新方法 (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中,这两个循环的使用在实践上确实没有区别。在这种情况下发生了什么我不明白的事情?

在此先感谢您的帮助。

最佳答案

for (solar_body body : bodies)

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

for (solar_body& body : bodies)

关于c++ - 为什么在 C++ 中的 for-each 循环期间我的 vector 中的项目不会改变?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21541117/

相关文章:

c++ - 友商+: no matching function for call

c++ - 析构函数 vs 成员函数竞赛

javascript - 使用for循环访问javascript中的对象属性?

c++ - 任何想法为什么这可能会关闭该程序?

c++ - std::find on map 无法正常运行并遍历 map 的键和值

r - 将 R 矩阵的行与预定义向量进行比较

c++ - 高 CPU 使用率 OpenGL Ver 3.1 + SDL2

c++ - DLL 卸载后使用 std::weak_ptr

Java 8 使用流重写一个复杂的 for 循环

c++ - STL vector里面类访问推送