在矢量循环中使用Object

时间:2013-10-10 12:17:51

标签: c++ loops vector stdvector

目前,我有一个迭代遍历向量的循环,我试图找到一个对象的索引,而我在循环中,删除它。我怎么能这样做?

这是我的代码:

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?

2 个答案:

答案 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,以便当下一次迭代再次递增时,不会跳过紧跟在已擦除元素之后的元素。