目前,我有一个迭代遍历向量的循环,我试图找到一个对象的索引,而我在循环中,删除它。我怎么能这样做?
这是我的代码:
for (Object &a : objectDict)
{
a.setTime(theTime);
double tempMoveX = 0, tempMoveZ = 0, tempUX = 0,tempUZ = 0;
for (Object &b : objectDict)
{
if (a != b)
{
...
debug << fixed << setprecision(20) << "Collision" << endl;
a.appendMass(b.getMass());
objectDict.erase(find(objectDict.begin(), objectDict.end(), b));
...
这是重要的部分。如何从矢量中删除对象b?
答案 0 :(得分:1)
一种简单的方法是简单地构建一个单独的向量,其中包含稍后要擦除的元素索引。完成常规向量后,通过“要删除”向量以相反顺序循环(相反,因为您不想在索引时使索引无效),并擦除它们。
或者,当您遍历原始矢量时,选择要保持的元素,并将它们复制到另一个矢量。在最后,交换两个向量(这是便宜的)。如果平均要删除相对较多的元素,这将更有效。
答案 1 :(得分:0)
好吧,如果你在迭代vector的元素时需要索引,而不是:
for (Object &a : objectDict) { ...
做传统:
for (size_t i = 0; i < objectDict.size(); ++i) { ...
并在循环体内:不使用引用a
,而是使用objectDict[i]
,然后当需要擦除元素时,可以执行以下操作:
objectDict.erase(vec.begin() + i);
i--;
i--
用于向后移动索引1
,以便当下一次迭代再次递增时,不会跳过紧跟在已擦除元素之后的元素。