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