Вы удаляете элемент списка, на который указывает итератор.Это делает недействительным итератор, что означает, что вы больше не можете его использовать.
Типичный цикл удаления для списка или вектора выглядит следующим образом:
for (auto iterator = list.begin(); iterator != list.end(); ) {
if (should_remove(iterator)) {
iterator = list.erase(iterator);
} else {
++iterator;
}
}
Обратите внимание, что если элементдолжен быть удален, итератор не увеличен, но вместо этого заменен результатом вызова erase
.
Вам нужно будет найти способ реорганизовать свой код, чтобы соответствовать этомушаблон.Это сложно, потому что ваше условие находится глубоко внутри функции столкновения, но вы можете сделать это (что имеет преимущество в том, чтобы сделать ваш код более эффективным, между прочим, избавившись от линейного поиска), или вы можете вместо немедленногоудалив элементы, соберите их в отдельный список, а затем удалите их после завершения итерации по основному списку.
Или вы можете превратить colliders_
в навязчивый список (например, из Boost.Intrusive,или рукописный).Навязчивые списки очень хороши для таких ситуаций, как ваша.