Поскольку изменение списка делает недействительными итераторы (так что вы не можете увеличивать их), вы должны хранить итераторы в безопасности до того, как список будет изменен.
В большинстве реализаций std :: list представляет собой двойной связанный список, следовательно, итерация, подобная
for(auto i=list.begin(), ii; i!=list.end(); i=ii)
{
ii = i; ++ii; //ii now is next-of-i
// do stuff with i
// call list.erasee(i).
// i is now invalid, but ii is already the "next of i"
}
Самый безопасный способ, это создать список, содержащий все "столкнувшиеся", затем выполнить итерацию по вызову "столкнувшиеся" list.remove(*iterator_on_collided)
(но неэффективно, так как имеет сложность O 2 )