0

目前,我有一个循环遍历一个向量,我试图找到一个对象的索引,而我在循环中,以删除它。我该怎么办?

这是我的代码:

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?

4

2 回答 2

1

一种简单的方法是简单地构建一个单独的向量,其中包含稍后要擦除的元素的索引。完成常规向量后,以相反的顺序循环通过“待删除”向量(反向循环,因为您不想在执行过程中使索引无效),然后删除它们。

或者,当您迭代原始向量时,选择要保留的元素,然后将它们复制到另一个向量。最后,交换两个向量(这很便宜)。平均而言,如果要删除的元素相对较多,这会更好。

于 2013-10-10T12:22:06.950 回答
0

好吧,如果您在迭代向量的元素时需要索引,而不是:

for (Object &a : objectDict) { ...

做传统的:

for (size_t i = 0; i < objectDict.size(); ++i) { ...

并在循环体内:而不是使用 reference a,您将使用objectDict[i],然后当您需要擦除元素时,您可以执行以下操作:

objectDict.erase(vec.begin() + i);
i--;

i--用于将索引向后移动,1以便在下一次迭代再次增加它时,不会跳过紧跟在已擦除元素之后的元素。

于 2013-10-10T12:21:08.833 回答