Здравствуйте, господа товарищи! Есть вектор указателей на объекты класса. Циклом перебираю все элементы данного вектора. Нужно при выполнении некоторого условия удалить элемент внутри цикла. Как это сделать?
Mr. Vazovsky , для достижения интересующего тебя результата у тебя есть два пути.
Путь первый - просто использовать erase в цикле по индексам. erase инвалидирует итераторы, поэтому цикл должен быть по индексам. Однако, это рискованный и далеко не оптимальный путь.
Путь второй - это именно erase-remove. Очень грязную реализацию этого подхода уже предложил Denis . Его пример довольно опасен, не покрывает пограничных случаев и лишен культуры. Но как пример - демонстрирует достижимость обозначенной функциональности.
Согласно C++ Core Guidelines у тебя нет необходимости заново писать уже имеющиеся стандартные алгоритмы. Поэтому, тебе лучше будет использовать связку remove_if и erase.
if (strstr(typeid(myObjects[i]).name(), "SomeName"))
Если в этой сроке есть аналогичность, то этот код не будет выполнять то, что ты от него хочешь. typeid работает иначе.
Проверку на конкретный тип надо сделать на уровне общего интерфейса, в виде виртуальной функции.
Или, если все телн и совсем терять нечего, то можно попробовать dynamic_cast.
Перебирай с конца, после чего для удаления можно хвостовой элемент перенести на место удаляемого и уменьшить длину вектора на 1 (в метаданных, т.е. если у тебя класс с вектором, уменьшаешь поле, означающее число значащих элементов в векторе). Иначе только копированием региона, потому что Си не умеет делать массивы изменяемой длины, об этом нужно заботиться программисту.
Максим Гришин, я так понимаю, что у человека проблема с условиями цикла.
Итого, Mr. Vazovsky, используйте erase, цикл делаете for (не foreach - он не допускает модификации коллекций, если я не ошибаюсь), и после удаления уменьшаете итератор на единицу.
Как то так:
for (int i=0; i<vect.size; i++)
{
if (//условие)
{
vect.erase(i);
i--;
}
}
Mr. Vazovsky, Дык, итерировать нужно с конца! Известная проблема, собственно, часть трудно отлавливаемых багов какой-нибудь Альфы/Цивы, когда город не обновляется, если предыдущий в списке был ужален в процессе обновления (в Альфе - построил колониста на последних жителях).