Вызов erase()
делает итератор недействительным. Вы должны использовать возвращаемое значение, которое является итератором для значения после удаленного элемента, например,
it2 = prime.erase(it2);
Но если вы сделаете это изменение (что необходимо!), Вам нужно удалить ++it2
из цикла for. Вам также необходимо внести оба изменения для it1
. Вот некоторый непроверенный код:
for (it1 = prime.begin(); it1 < prime.end();) {
for(it2 = it1 + 1; it2 < prime.end();) {
if (*it2 % *it1 == 0)
it2 = prime.erase(it2);
else
++it2;
}
if (*it1 < 1000)
it1 = prime.erase(it1);
else
++it1;
}
Обратите внимание, что удаление it2
будет не аннулировать it1
, потому что это происходит строго до it2
из-за it2 = it1 + 1
. Так что вам не нужно беспокоиться об этом вмешательстве.