我在粒子系统中有一个名为 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/