Сложно изменить коллекцию во время итерации, и, как правило, не стоит накладных расходов на ее поддержку в контейнере. В этом случае (вектор) вы лишаете законной силы итератор (то есть указатель на векторное хранилище), как только вектор перераспределяется при его увеличении.
Взгляните на vector :: push_back , в частности, на обсуждение валидности итераторов.
На практике вы можете избежать этой конкретной проблемы, определив размер вектора, но есть также проблемы отслеживания того, куда вы помещаете новые элементы относительно итератора, и т. Д. В общем, это приводит к трудному для понимания коду, даже когда это правильно (или хуже, выглядит так, но имеет тонкие проблемы).
Я предлагаю вам переписать для двухпроходного подхода, собрать элементы для добавления или удаления за один проход, затем удалить их и т. Д. Если у вас нет очень хороших (и измеримых!) Причин производительности, чтобы не делать этого, это происходит чтобы было легче понять и поддерживать. Напомним, что vector :: erase может принимать диапазон.
Стоит также спросить: важен ли здесь порядок? Если вы используете std :: unordered_set, в этом случае у вас не будет этой конкретной проблемы.
Посмотрите, что вы думаете об этом подходе, прежде чем "исправить" этот.