迭代向量并删除某些元素的正确方法是什么

时间:2017-01-25 21:58:58

标签: c++ arrays loops vector iterator

我遇到了一个问题,我想通过我的矢量并删除不再需要的元素。它失败的原因是显而易见的,但是当我尝试我天真的方法时,我没有看到它。基本上,当我擦除一个元素时,迭代器会失效,并且循环无法继续。我做的是以下内容:

    #define GOOD 1
    #define BAD 0

    struct Element
    {
        Element(int isGood) : good(isGood){}
        bool good;
    };

    int main()
    {
        std::vector<Element> arr;
        arr.push_back(Element(BAD));
        arr.push_back(Element(GOOD));
        arr.push_back(Element(BAD));
        arr.push_back(Element(GOOD));

    //__CLEAN ARRAY__//
        for (auto it = arr.begin(); it != arr.end(); ++it)
        {
            if ((*it).good == false) arr.erase(it);
        }
    }

所以很明显,这不起作用,我想知道这样做的正确/最佳方式是什么。如果找不到好的话,我的下一步是用新的迭代器重新启动循环,但这似乎也是浪费。理想情况下,循环会在新的迭代器停止的地方继续吗?

感谢。

1 个答案:

答案 0 :(得分:3)

你想:

arr.erase( std::remove_if(arr.begin(), arr.end(), [](auto& obj){return obj.good == false;}), arr.end() );

及其名为remove-erase idiom:

https://en.wikipedia.org/wiki/Erase%E2%80%93remove_idiom

但是如果你想修复循环然后就可以了,erase会返回下一个有效的迭代器,所以你应该使用它:

    for (auto it = arr.begin(); it != arr.end(); )
    {
      if ((*it).good == false) 
        it = arr.erase(it);
      else
        it++;
    }