我遇到了一个问题,我想通过我的矢量并删除不再需要的元素。它失败的原因是显而易见的,但是当我尝试我天真的方法时,我没有看到它。基本上,当我擦除一个元素时,迭代器会失效,并且循环无法继续。我做的是以下内容:
#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);
}
}
所以很明显,这不起作用,我想知道这样做的正确/最佳方式是什么。如果找不到好的话,我的下一步是用新的迭代器重新启动循环,但这似乎也是浪费。理想情况下,循环会在新的迭代器停止的地方继续吗?
感谢。
答案 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++;
}