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


(Marcinch7) #1

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.


(Fiołek) #2

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);

}

([alex]) #3

(*motion_iter).alpha

to samo co:

motion_iter->alpha

dla iteratorów też to działa


(Marcinch7) #4

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

Czysta ciekawość.


([alex]) #5

++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.


(Fiołek) #6

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.


(Marcinch7) #7

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