Я считаю, что проблема в том, что в некоторых случаях (в тех случаях, когда вы удаляете элемент), вы дважды увеличиваете итератор.Ваш цикл for выглядит следующим образом:
for(std::list<T>::iterator jt = l.begin(); jt != l.end(); jt++) {
....
}
Но внутри него вы делаете что-то вроде этого:
jt = l.erase(jt);
Итак, если случается, что вы делаете стирание, вы стираетеи, в то же время, установите итератор для следующего элемента ... Но вы также увеличиваете его с помощью jt++
!
Простой способ исправить это - переписать цикл for немного, чтобысоответствует этому форм-фактору:
for(std::list<T>::iterator it = l.begin(); it != l.end(); ) { // notice no increment!
// ...
if(cond) {
it = l.erase(it);
} else {
++it;
}
}
, поэтому вы делаете одно или другое приращение, но не оба одновременно.