У меня есть код, который выглядит следующим образом:Можете ли вы удалить элементы из std :: list, итерации через него?
for (std::list<item*>::iterator i=items.begin();i!=items.end();i++)
{
bool isActive = (*i)->update();
//if (!isActive)
// items.remove(*i);
//else
other_code_involving(*i);
}
items.remove_if(CheckItemNotActive);
я хотел бы удалить неактивные элементы сразу после их обновления, Симметричного, чтобы избежать ходить снова список. Но если я добавлю прокомментированные строки, я получаю сообщение об ошибке, когда я доберусь до i++
: «Список итераторов не увеличивается». Я попробовал несколько альтернатив, которые не увеличивались в инструкции for, но я не мог заставить ничего работать.
Каков наилучший способ удаления предметов, когда вы идете по std :: list?
совершенный, работал как шарм. – AShelly
На самом деле, это не гарантирует работу. С «erase (i ++);», мы знаем только, что pre-incremented value передается в erase(), а i увеличивается до половины двоеточия, не обязательно перед вызовом erase(). "iterator prev = i ++; erase (prev);" обязательно будет работать, так как используется возвращаемое значение –
Нет Джеймса, i увеличивается до вызова erase, и предыдущее значение передается функции. Аргументы функции должны быть полностью оценены до вызова функции. –