Вектор. Почему элементы удаляются через одного
В общем нужно удалить все 0. Но если числа стоят в начале или конце или два рядом, то происходит какая-то чушь. Почему и как исправить ? А еще нашел функцию - удаление по значению, но жалуется на значение:
int value_to_remove = 0;
v.erase(std::remove(v.begin(), v.end(), value_to_remove), v.end());
int main()
{
int n;
cout << "Введите количество чисел в векторе: "; cin >> n;
vector<int> v(n);
cout << "Заполните вектор: ";
for (int i = 0; i < n; i++) {
cin >> v[i];
}
for (int i = 0; i < v.size(); i++) {
if (v[i] == 0) {
v.erase(v.begin() + i);
}
}
for (int i = 0; i < v.size(); i++) {
cout << v[i] << " ";
}
}
Ответы (3 шт):
for (int i = 0; i < v.size(); i++) {
if (v[i] == 0) {
v.erase(v.begin() + i);
i--;
}
}
Пример перемещения в конец с последующим удалением v.erase(std::remove(v.begin(), v.end(), 0), v.end()); в вопросе, не должен приводить к ошибкам, ошибку ищите в другом месте(если она есть), а удаление в цикле можете выполнить например так:
int i = 0, sz = v.size();
while (i < sz)
{
if (v[i]) ++i;
else {
v.erase(v.begin() + i);
--sz;
}
}
Почему
Ну вот стоят два нуля на местах k и k+1. Ноль на месте k удаляется, тогда следующий ноль встаёт на его место. Но уже не проверяется, ведь следующая итерация цикла проверяет k+1-й индекс.
и как исправить ?
Самое простое - обойти вектор от конца к началу.