Вы удаляете элементы так же, как вы удаляете любые элементы из любого std::vector
- например, с помощью метода std::vector::erase()
. Все, что вам для этого нужно - это iterator
до нужного элемента для удаления.
В вашем случае, поскольку вы храните std::shared_ptr<std::string>
объекты, а не фактические std::string
объекты, вам может понадобиться что-то вроде std::find_if()
, чтобы найти элемент вектора, содержащий требуемое строковое значение Например:
void removeEnemy(string name)
{
auto iter = std::find_if(enemy.begin(), enemy.end(),
[&](auto &s){ return (*s == name); }
);
if (iter != enemy.end())
enemy.erase(iter);
}
ОБНОВЛЕНИЕ: в новом коде, который вы добавили, вы неправильно смешиваете индексы и итераторы вместе. Вы создаете бесконечный цикл , если vector
не пустой, так как вы никогда не увеличиваете итератор it
, который контролирует ваш цикл, вы вместо этого увеличиваете свою переменную index i
(смотрите, что происходит, когда Вы не даете своим переменным уникальные и значимые имена?). В итоге вы выходите за пределы vector
в окружающую память. Вот почему вы получаете ошибку segfault.
Даже если вы (пытаетесь) использовать итератор для циклического перебора vector
, вы используете индексы для доступа к элементам вместо разыменования итератора для доступа к элементам. В этой ситуации вам вообще не нужно использовать индексы, одного итератора будет достаточно.
Попробуйте вместо этого:
void RemoveEnemy( vector<shared_ptr<Enemy>> & chart, string id )
{
for(auto it = chart.begin(); it != chart.end(); ++it)
{
if (id == it->GetEnemyID() )
{
chart.erase(it);
return;
}
}
Или, используя код, который я предложил ранее:
void RemoveEnemy( vector<shared_ptr<Enemy>> & chart, string id )
{
auto iter = std::find_if(chart.begin(), chart.end(),
[&](auto &enemy){ return (enemy->GetEnemyID() == id); }
);
if (iter != chart.end())
chart.erase(iter);
}