是否可以一步一步地遍历 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()
);

09-25 19:19