Это потому, что вы делаете it++
(пост-действие l oop) после вашего it = t.begin()
.
Удалите это и вставьте else it++
(хотя я предпочитаю ++it
) в твоем теле; это должно произойти только тогда, когда вы не делаете стирание.
Это похоже на метод для стирания из map
во время итерации по нему .
Подчеркнув этот метод, мы можем заметить, что ваш else it = t.begin()
расточителен: вы каждый раз начинаете с начала l oop, что увеличивает сложность алгоритма c вашего алгоритм.
Вместо этого используйте итератор, возвращаемый erase
.
void esborra_tots(list<Estudiant>& t, int x) {
list<Estudiant>::iterator it;
list<Estudiant>::iterator itend = t.end();
for (it = t.begin(); it != t.end(); ) {
if ((*it).consultar_DNI() == x) {
it = t.erase(it);
}
else {
++it;
}
}
}
Обратите внимание, что нам больше не нужно проверять список на пустоту; если он теперь пуст, it
будет t.end()
, а l oop все равно закончится.
В настоящее время вы не используете itend
. Вы не можете просто поменять его в условие l oop по понятным причинам, но если вы сбросите его, когда он будет признан недействительным, это может быть целесообразным:
void esborra_tots(list<Estudiant>& t, int x) {
for (auto it = t.begin(), end = t.end(); it != end; ) {
if (it->consultar_DNI() == x) {
it = t.erase(it);
end = t.end();
}
else {
++it;
}
}
}
Однако, это может быть понятнее просто придерживайтесь своего исходного кода, но удалите неиспользованную itend
декларацию.