Как удалить элемент вектора по индексу?

Пытаюсь удалить элемент вектора если поле соответствует тому, что я ввел с клавиатуры, найденный мною способ на просторах интернета удаляет только два элемента, хотя должен по идее удалять все, код функции:
void Delete(vector <Train *> &train)
{
	string dest;

	cout << "\nВведите пункт назначения для удаления поезда:" << endl; cin >> dest;
	for (int i = 0; i < train.size(); i++)
		if (train[i]->GetDest() == dest)
			train.erase(train.begin() + i);
}
  • Вопрос задан
  • 1392 просмотра
Решения вопроса 1
wataru
@wataru Куратор тега C++
Разработчик на С++, экс-олимпиадник.
Не работает ваш код потому, что, допустим при i==3 вы удаляете элемент. Теперь элементом по индексу i будет следующий за удаленным элемент. Вы его не проверите и в конце итерации i увеличится на 1. Таким образом, следующие за удаляемым элементом вы просто пропустите.

Есть много способов исправить эту оплошность:
1) При удалении уменьшайте i на 1, чтобы следующее i++ от цикла for было отменено.
2) Вместо цикла for используйте while, где вы инкрементируете i только если элемент не удаляется.
3) Вместо if используйте цикл while, который удялял бы элемент в позиции i, пока его надо удалять (не забудьте проверить, что элемент, таки, существует - вы могли удалить последний элемент и i станет за границей массива).
4) (лучший вариант) Используйте remove. Мало того, что вам не надо изобретать велосипед, так этот метод еще и будет на порядок быстрее удаления по одному элементу. Потому что при каждом удалении у вас сдвигается часть массива и вы получаете квадратичное время работы на ровном месте.
Ответ написан
Комментировать
Пригласить эксперта
Ваш ответ на вопрос

Войдите, чтобы написать ответ

Похожие вопросы