Напомним, что reverse_iterator::base()
всегда на один элемент за очевидным значением итератора.Например, после auto rit = s1.rbegin()
, *rit
возвращает последний элемент, а rit.base() == s1.end()
.
Другими словами, *rit == *prev(rit.base())
В вашем цикле изначально rit.base() == s1.end()
.Тогда std::next(rit).base()
относится к последнему элементу;этот элемент стирается.В std::set
удаление элемента только делает недействительными итераторы для этого элемента, но не для любых других.s1.end()
все еще является действительным итератором, как и rit
, с rit.base()
по-прежнему равным s1.end()
.Поэтому на следующей итерации цикла вы снова стираете последний элемент и снова оставляете rit.base() == s1.end()
.И т. Д.
В какой-то момент последний элемент стирается, s1
становится пустым, а затем *rit
демонстрирует неопределенное поведение.Напомним, что *rit == *prev(rit.base())
, но предыдущего элемента больше нет.