矢量迭代次数比size()

Woj*_*tek 2 c++ iterator std stdvector

我有这段代码:

for (std::vector<Marker>::iterator it = markers.begin(); it != markers.end(); ++it) {
    if (it->getDots().size() < 3) {
        markers.erase(it);
    }
}
Run Code Online (Sandbox Code Playgroud)

在其中一个测试输入(应用程序进行图像分析)中,我得到了一个段错误.我试图调试代码(无济于事)并注意到一件事.当问gdb p markers.size()我收到$9 = 3.所以我希望循环迭代三次,但令人惊讶的是它(至少)完成了5次.在第五次迭代中有一个段错误.我还注意到,导致错误的不是*it(这里it->)的解引用.具体来说it->getDots(),这是一个简单的吸气剂.

我很少用C++编写,所以它可能是一个简单的错误,但我的调试和谷歌搜索都没有带来任何解决方案.你能帮忙吗?

我想强调的是,在各种不同的输入(略有不同的图像)上,这个功能正常工作,所以我更难以追踪到这个错误.

Igo*_*nik 6

vector::erase使指向要擦除的元素的所有迭代器以及后面的所有元素无效.因此it变得无效,并且++it下一循环迭代中的表达式表现出未定义的行为.

编码此逻辑的最佳方法是使用擦除删除习惯用法.