vector i erase
Ostatnio zmodyfikowano 2010-02-03 20:36
dmx81 Temat założony przez niniejszego użytkownika |
vector i erase » 2010-02-03 19:22:20 witam. majac wektor z obiektami swojej klasy, chce uzyc erase, dla przykladu: obiekty to np pociski po nacisnieciu klawisza, powstaje nowy obiekt pocisk przy kolizji - dany pocisk bedzie usuniety, erase
no i zastanawialem sie, czy jesli petla bedzie sprawdzala po kolei wszytskie pociski od int i=0, do i<pociski.size(), czy ktorys z nich nie ma kolizji w danym ruchu (kroku innej petli), to jesli jeden z nich usune przez erase, czy sie numeracja nie poprzestawia (pocisk[4] bedzie erase, i pocisk[5] wskoczy na jego miejsce, a i bedzie mialo w nastepnym kroku wart. 5 , czyli bym go pominal)
myslalem, ze moge to rozwiazac, przez tworzenie tabeli, do ktorej beda dodawane wartosci indeksow pociskow, ktore maja kolizje, a dopieru po przejsciu petli, usunac wlasnie te pociski wg indeksow z tabeli
ale nie wiem, czy to konieczne, no i czy rozwiazanie bedzie dobre |
|
malan |
» 2010-02-03 19:48:57 erase sama przesuwa elementy w tablicy, także taka pętla powinna zadziałać poprawnie: for( int i = 0; i < vTablica.size(); i++ ) if( Kolizja( vTablica[ i ] ) == true ) vTablica.erase( vTablica.begin() + i );
Rozmiar ( size) również się zmieni "automatycznie". |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-02-03 20:16:00 ok, ale majac np w tablicy 4 obiekty, jesli na drugim (i=1) napotka kolizje, usunie mi ten obiekt, wtedy chcac wykonac krok dla i=2, trafi tak naprawde na moj ostatni obiekt (ktory przed erase mial nr3, teraz nr2), a moj stary nr 2 zostanie w tym kroku pominiety? kod ma wykonac for( int j = 0; j < pociski.size(); j++ ) { pociski[ j ].x++; for( int i = 0; i < przeszkody.size(); i++ ) { if( kolizja( pociski[ j ], przeszkody[ i ] ) skasuj( pociski[ j ] ) } } for( int j = 0; j < pociski.size(); j++ ) rysuj( pociski[ j ] ) czyli j=0 leci pocisk0, brak kolizji, .. j=4 leci pocisk4 - kolizja - kasowanie,pocisk4 out, pocisk5 to teraz pocisk4, pocisk 6 to pocisk5 j=5 leci pocisk5(czyli nasz stary6??), stary pocisk5 - ominiety w tym kroku? czy cos zle mysle? jesli dobrze, to myslalem, ze zamiast erase pocisk4, poprostu do tabeli "do_usuniecia" dodac: do_usuniecia[ 0 ] = 4, do usuniecia[ 1 ] = 7 itd a pozniej for( i = 0; i < do_usuniecia.size; i++ ) erase pocisk[ do_usuniecia[ i ] ] oczywiscie kod z glowy, nie patrzac na jego poprawnosc, ale idee co o tym myslicie? |
|
Elaine |
» 2010-02-03 20:32:24 Nie wystarczy zdekrementować licznika pętli po usunięciu elementu, albo po prostu iterować od tyłu? |
|
dmx81 Temat założony przez niniejszego użytkownika |
» 2010-02-03 20:36:40 wystarczy :) dzieki za podpowiedz
|
|
« 1 » |