Dziwne, że kompilacji, a nie wykonania, ale jeżeli tą linijką:
i = lista.erase(i);
usuniesz ostatni element z listy, to i będzie skazywać na lista.end(). Jak teraz zrobisz i++ to błąd gotowy.
PS. Zrób porządek i dodaj klamry w każdym ifie i forze, żeby było widać co się tam dzieje w jakiej instrukcji, bo tak to trzeba się wczytywać i m.in. przez to są tego typu problemy.