c++ - 引用二维 vector 中的元素 (c++)

标签 c++ reference vector

我在粒子系统中有一个名为 Spring 的类。构造函数如下所示:

Spring(Particle& _a, Particle& _b);

我有一个粒子 vector ,我使用

Spring mySpring = Spring(myParticles.at(j),myParticles.at(j+1));

在循环内添加两个粒子之间的 Spring 力。到目前为止一切正常。 但是,我想使用粒子的二维 vector 。即:

Spring mySpring = Spring(myParticles.at(i).at(j),myParticles.at(i).at(j+1));

而且我没有得到对粒子的引用。在第一个示例中,每当我更改 spring 类中的粒子时, vector 中的粒子也会发生变化。在第二个示例中,更改仅在本地进行。如何更改 2D Vector 中的粒子?

编辑: 我试图弄清楚一些事情:

我有一些粒子系统,每个粒子系统都由许多粒子组成。每个粒子应该只与与其在同一系统中的其他粒子相互作用。因此我有一个粒子系统 vector ,每个粒子系统都是粒子对象的 vector 。 (这就是二维 vector )。第一维 (i) 是系统,第二维 (j) 是单个粒子。 系统中的粒子彼此相互作用(碰撞、躲避等等),它们的位置也会发生变化。 vector 得到“更新”。 (也就是引用书)。

但是,我有第二个 (1d) Spring 力 vector 。 Spring 力也用于更新粒子的位置。 我的构造函数执行以下操作:

Spring::Spring(Particle& _a, Particle& _b) {
    a=&_a;
    b=&_b; }

a 和 b 是 Particle*。所以我在 2d vector 中存储指向两个粒子的指针。另一个函数 Spring.doSpring() 改变粒子的位置。

a->pos.x=300;

a->velocity+=something..

在我发布的第一个示例中,我只使用了一个粒子系统,因此不需要二维 vector 。一切正常。 vector 中的粒子得到更新。 但是在第二个示例中,我的程序运行了,但无论 doSpring 函数做什么,二维 vector 中的粒子都不会更新。

最佳答案

将引用/指针指向 vector 内部元素的最常见问题之一是重新分配。例如,如果你 push_back,vector 可能会超出其容量,分配一个新的内存块,复制所有内容,然后释放旧 block 。如果您在 vector 中获取了对元素的引用或指针,这些元素仍然指向旧 block ,现在是死内存,这是一个严重的错误!

所以我猜你的粒子效果不断地向你的粒子 vector 添加新粒子,这在某些时候会导致 vector 在超出容量时重新分配。 Spring 类存储的指针没有更新,因此指向死内存并且对实际粒子没有影响,粒子被 vector 移动到其他地方。

不要引用或指针指向 vector 中的元素。使用指针 vector 、列表或其他一些不会在内存地址周围打乱的容器实际要素。如果必须,请对 vector 中的元素使用迭代器。在调试版本中,假设您有一个经过检查的 STL 实现,如果您在 vector 重新分配自身后通过迭代器访问该元素,您将收到调试警报。

关于c++ - 引用二维 vector 中的元素 (c++),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2207009/

相关文章:

c++ - 如何初始化和打印 std::wstring?

c# - 如何在 C# 中就地截断数组

c++ - 初始化引用成员:语法不同的原因

C++将分隔文件导入 vector

c++ - 在函数调用时将值更改为随机数?

c++ - 为什么 "<<"运算符可以被继承而 ">>"运算符不能?

c++ - 在递归中使用按引用传递

c++ - 在 C++ 中重载 + 和 += 运算符

javascript - Three.js: 获取相机正在看的方向

c++ - 并行分配给 std::vector<std::vector<double>>