Прочитайте документацию для std::remove
еще раз.
Функция не удаляет элементы из контейнера (фактически, она даже не знает , что контейнер задействован, поскольку видит только итераторы), она просто перемещает значения вупорядочить и вернуть новый итератор i
так, чтобы весь интервал [ begin .. i [
содержал все не удаленные элементы в исходном порядке.Элементы, оставшиеся в [ i .. end [
, не определены, и вы обязаны исключить этот интервал из контейнера (если он вам нужен):
auto i = std::remove(...);
v.erase(i,v.end());
Причина, по которой у вас есть дополнительный 5
, заключается в том, чтотипичный алгоритм удаления копирует значения в отверстия, оставленные удаленными значениями, и поскольку значения после итератора i
никогда не перезаписываются, они остаются такими же, как в исходной последовательности.Такое поведение, однако, ненадежно - просто удалите значения после i
, не читая их.