c ++如何在循环内使用带有自动的向量擦除对象

doi*_*git 1 c++ pointers for-loop vector auto

嗨,stackoverflow 的人们,

我一直想知道是否有任何简单的方法:迭代器控制范围的 for 循环在访问它时从其容器中正确擦除对象;使用自动它。

对于标准的索引控制的 for 循环,我会做这样的事情:

void del(int i){
    cout<<"Deleting: "<<myObjects[i]<<':'<<myObjects[i]->c<<endl;
    for(unsigned int j = 0; j < allObjects.size();){
        if(allObjects[j] == myObjects[i]){
            delete allObjects[j];
            allObjects[j] = 0;
            allObjects.erase(allObjects.begin()+j);
            break;//Found and deleted first instance, escaping for-loop.
        }else{
            ++j;
        }
    }
    myObjects[i]=0;
    myObjects.erase(myObjects.begin()+i);
}
Run Code Online (Sandbox Code Playgroud)

自动 for 循环看起来像这样:

void del(int i){
    cout<<myObjects[i]<<endl;
    for(auto it: allObjects)
        if(it == myObjects[i]){
            delete it;
            it = 0;
            //allObjects.erase();// Found, needs erasing.
        }
    myObjects[i]=0;
    myObjects.erase(myObjects.begin()+i);
}
Run Code Online (Sandbox Code Playgroud)

我一直无法正确解决这个问题,并且一直在求助于旧式索引(使用索引的多种方法)。

我可以删除它,并将其设置为 0,但是如何在不知道索引的情况下从向量中删除它,并且可能在向量中删除它?我知道我可以跟踪循环并使用计数器来做到这一点,但这会破坏使用干净的迭代器循环的目的。

如果不在向量中删除,除了重新访问向量之外,我之后如何以轻松的方式进行处理?

使用索引驱动的 for 循环没有错,只是想知道是否有使用我们的新朋友“auto it”的简单替代方法。

谢谢。

Ice*_*ire 5

抱歉,没有办法使用基于范围的 for 循环来擦除。您应该使用标准方式:

for(auto it = allObjects.begin(); it != allObjects.end();)
{
    if(/* condition */)
        it = allObjects.erase(it);
    else
        ++it;
}
Run Code Online (Sandbox Code Playgroud)

另请参阅此处的最佳答案:Can we erase the items in range-based for loop in c++11