Как удалить элемент вектора по индексу? Пытаюсь удалить элемент вектора если поле соответствует тому, что я ввел с клавиатуры, найденный мною способ на просторах интернета удаляет только два элемента, хотя должен по идее удалять все, код функции:void Delete(vector &train) { string dest; cout > dest; for (int i = 0; i GetDest() == dest) train.erase(train.begin() + i); }

30 Окт 2021 в 20:04
126 +1
0
Ответы
1

Проблема возникает из-за того, что при удалении элемента из вектора все индексы сдвигаются, и после удаления элемента на позиции i, элемент, который находился на позиции i+1, становится на позицию i. При этом цикл не увидит этого элемента и пропустит его проверку.

Чтобы избежать этой проблемы, можно переписать функцию Delete следующим образом:

void Delete(vector <Train *> &train) {
string dest;
cout << "\nВведите пункт назначения для удаления поезда:" << endl;
cin >> dest;
for (auto it = train.begin(); it != train.end();) {
if ((*it)->GetDest() == dest) {
it = train.erase(it);
} else {
++it;
}
}
}

В этой версии функции мы используем итератор для обхода вектора и делаем проверку на совпадение с условием удаления. Если элемент соответствует условию, то удаляем его итератором, и передвигаем итератор на следующий элемент с помощью ++it. В итоге все элементы соответствующие условию будут успешно удалены.

17 Апр в 09:15
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Название заказа не должно быть пустым
Введите email
Бесплатные доработки
Гарантированные бесплатные доработки
Быстрое выполнение
Быстрое выполнение от 2 часов
Проверка работы
Проверка работы на плагиат
Интересные статьи из справочника
Поможем написать учебную работу
Название заказа не должно быть пустым
Введите email
Доверьте свою работу экспертам
Разместите заказ
Наша система отправит ваш заказ на оценку 90 246 авторам
Первые отклики появятся уже в течение 10 минут
Прямой эфир