Mam kod, który wygląda tak:Czy potrafisz usuwać elementy ze std :: list podczas ich iteracji?
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);
chciałbym usunąć nieaktywnych elementów natychmiast po ich aktualizacji, inorder uniknąć znowu chodzenie listę. Ale jeśli dodaję skomentowane linie, dostaję błąd, gdy dojdę do i++
: "Lista iteratorów nie jest przyrostowa". Próbowałem niektórych zastępców, które nie zwiększyły się w oświadczeniu for, ale nie mogłem dostać nic do pracy.
Jaki jest najlepszy sposób na usunięcie przedmiotów podczas przechodzenia przez std :: list?
idealny, działał jak czar. – AShelly
Właściwie to nie gwarantuje pracy. Dzięki "erase (i ++);" wiemy tylko, że wstępnie zwiększona wartość jest przekazywana do erase(), a i jest zwiększane przed średnikiem, niekoniecznie przed wywołaniem wymazywania(). "iterator prev = i ++; erase (prev);" na pewno zadziała, jak to jest w użyciu wartość zwracana –
Nie James, i jest zwiększana przed wywołaniem kasowania, a poprzednia wartość jest przekazywana do funkcji. Argumenty funkcji muszą zostać w pełni ocenione przed wywołaniem funkcji. –