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

30 Окт 2021 в 20:04
151 +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 Апр 2024 в 09:15
Не можешь разобраться в этой теме?
Обратись за помощью к экспертам
Гарантированные бесплатные доработки в течение 1 года
Быстрое выполнение от 2 часов
Проверка работы на плагиат
Поможем написать учебную работу
Прямой эфир