Problem z usuwaniem iteratora w liście STL wewnątrz pętli

Hej, pisze sobie w C++ taki, hmmm… Motion-blur, i mam problem z usuwaniem iteratorów z listy STL w pętli “for”.

Gdy zakomentuję pogrubioną linijkę kodu to blur działa, gdy nie to dostaje errora: list iterator is not incrementable… Pomóżcie.

Iterator który zostanie usunięty(stl::list::erase) traci swoją ważność. stl::list::erase zwraca iterator na _następny_ poprawny element.

for(motion_iter=motion.begin();motion_iter!=motion.end();/*! motion_iter++*/)

{

if((*motion_iter).alpha>0)

{

//...

++motion_iter;

}

else motion_iter = motion.erase(motion_iter);

}

(*motion_iter).alpha

to samo co:

motion_iter->alpha

dla iteratorów też to działa

Ok, Fiołek, możesz mi wytłumaczyć jeszcze jaka jest różnica między motion_iter++; a ++motion_iter; ??

Czysta ciekawość.

++motion_iter; -> zwiększa iterator, zwraca referencje na siebie samego.

motion_iter++; -> tworzy nowy iterator (kopie), zwiększa iterator, zwraca zrobioną kopie. W sumie przynajmniej dwukrotnie używa konstruktor kopiujący tego iteratora.

Post- i preinkrementacja. O ile dla typów wbudowanych nie ma to znaczenia, o tyle dla iteratorów to kilka taktów i trochę pamięci mniej(pre - inkrementuje i zwraca referencje do siebie, post - tworzy obiekt tymczasowy(robi swoją kopie), inkrementuje siebie i zwraca wcześniej utworzoną kopie).

@EDIT: spóźniony.

Dzięki, temat można zamknąć.