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.
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ąć.