Panel użytkownika
Nazwa użytkownika:
Hasło:
Nie masz jeszcze konta?

vector i erase

Ostatnio zmodyfikowano 2010-02-03 20:36
Autor Wiadomość
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
P-13532
malan
» 2010-02-03 19:48:57
erase sama przesuwa elementy w tablicy, także taka pętla powinna zadziałać poprawnie:
C/C++
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".
P-13536
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
C/C++
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
C/C++
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?
P-13538
Elaine
» 2010-02-03 20:32:24
Nie wystarczy zdekrementować licznika pętli po usunięciu elementu, albo po prostu iterować od tyłu?
P-13541
dmx81
Temat założony przez niniejszego użytkownika
» 2010-02-03 20:36:40
wystarczy :) dzieki za podpowiedz
P-13542
« 1 »
  Strona 1 z 1