Ваш алгоритм некорректен, потому что вы не поняли, что вернул erase
.
Когда вы используете erase
, он удаляет элемент, на который указывает итератор, и возвращает итератор к следующему элементу.
Если вы хотите перебрать все элементы списка, это означает, что всякий раз, когда использовалось erase
, вы не должны увеличивать его.
Это normal код, который вы должны были получить:
if (Player->BoundingBox.Intersect(i->BoundingBox)) {
i = Drop_System.erase(i);
}
else {
++i;
}
И это аккуратно решает проблему, с которой вы столкнулись!Потому что когда вы erase
последний элемент, erase
вернет тот же итератор, что и end
, то есть итератор, указывающий элемент «один за последним».Этот итератор не должен никогда увеличиваться (его можно уменьшить, если список не пуст).