Разрешено ли стирать элемент, на который указывает итератор, и продвигать тот же итератор на одну строку, чтобы перейти к следующему элементу?
set<int>::iterator it = S.begin();
while (it != S.end()) {
if (shouldBeRemoved(*it)) {
S.erase(it++); // is this line valid?
} else {
++it;
}
}