是否可以一步一步地遍历 vector 的元素,同时删除某些元素,以防止重复处理?
(我知道该片段是伪造的,但说明了我想要的内容)
std::vector<MyRecord*>* BLV = GetVector();
for (std::vector<MyRecord*>::iterator it = BLV->begin(); it != BLV->end(); ++it)
{
MyRecord* BL = *it;
if(Selected)
{
delete BL;
BLV->erase(it);
}
}
最佳答案
songyuanyao已经给您一个不错的答案:简而言之,您必须将迭代器重置为erase
返回的值。
但是,如果适用,我建议使用一个unique_ptr vector 和“擦除删除”习惯用法(这也更有效,因为它只移动元素一次)。
std::vector<std::unique_ptr<MyRecord>>* BLV = GetVector();
BLV->erase(
std::remove_if(BLV->begin(), BLV->end(),
[&](const std::unique_ptr<MyRecord>& rec) { return Selected; }
),
BLV->end()
);