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

Allegro 5 budowa gier

Ostatnio zmodyfikowano 2013-04-12 22:16
Autor Wiadomość
Elaine
» 2013-04-07 15:37:03
vec.erase( i );
 unieważnia iterator i.
Niekoniecznie.
Koniecznie, 23.3.6.5/3:
Effects: Invalidates iterators and references at or after the point of the erase.
P-80160
ison
» 2013-04-07 15:39:37
@hincu opanuj się, jeśli nie masz nic ciekawego do powiedzenia to nie pisz. Monika90 miała akurat rację.
P-80161
maly
» 2013-04-08 17:33:04
Podbije temat bo teraz nie rozumiem,skoro mówicie że "usuniętego" iteratora nie można użyć to czemu poniższy kod działa u mnie prawidłowo?
C/C++
class CKlasa
{
public:
    CKlasa( int b )
        : bb( b )
    { }
    int bb;
};

int main()
{
    std::vector < CKlasa > VecKlasa;
   
    for( int q = 0; q < 1000; ++q )
         VecKlasa.push_back( CKlasa( q ) );
   
    std::vector < CKlasa >::iterator itP;
    for( itP = VecKlasa.begin(); itP != VecKlasa.end(); ++itP )
    {
        VecKlasa.erase( itP );
        --itP;
    }
   
    for( itP = VecKlasa.begin(); itP != VecKlasa.end(); ++itP )
         std::cout <<( * itP ).bb << std::endl;
   
    return 0;
}
//Down
No to czeka mnie pare przeróbek.
Ciekawe ile jeszcze niespodzianek kryje Standard Template Library?;P
P-80214
pekfos
» 2013-04-08 19:22:47
Iterator nie jest modyfikowany przez erase, dalej wskazuje na to samo miejsce w pamięci. Vector usuwając zakres ze środka tylko kopiuje/przenosi elementy za zakresem w miejsce usuniętych, więc iterator wskazuje na pierwszy element, który był za usuwanym zakresem (jeśli jakiś tam był).

Standard jednak mówi, że tego iteratora nie należy używać, więc to, że twój kod działa, zależy od implementacji biblioteki standardowej. Pod inną może być problem.
P-80227
aaadam
Temat założony przez niniejszego użytkownika
» 2013-04-09 22:11:33
C/C++
for( itP = Pociski.begin(); itP != Pociski.end(); itP++ )
{
    for( itR = Robaki.begin(); itR != Robaki.end(); itR++ )
    {
        if( Collision( robak1, pociskbmp, itP->getX(), itP->getY(), itR->getX(), itR->getY(), 20, 20 ) )
        {
            itR = Robaki.erase( itR );
            //  itP =Pociski.erase(itR);
        }
    }
}

to jest moja funkcja która sprawdza kolizję dołączyłem to do starego kodu działa usuwanie robaków ale tylko do ostatniego elementu.Np mogę zestrzelić 9 pierwszych z dziesięciu a jak zestrzelę 10tego to się zacina także się zacina jak od razu zestrzelę ostatni a 9 pozostałych jest na swoim miejscu . Pewnie jakiś wyciek pamięci.
To samo tyczy się pocisków nie mogę usunąć ostatniego elementu. Trochę kombinowałem ale nie mogę coś tego ustawić ;/  proszę o pomoc.
P-80287
Monika90
» 2013-04-10 00:00:41
Powinieneś inkrementować ierator itR tylko wtedy, gdy nie wywołałeś itR = Robaki.erase( itR );
Przyjrzyj się uważnie przykładowi, który podałam na poprzedniej stronie. Tam jest petla while, a po if jest else.
P-80307
aaadam
Temat założony przez niniejszego użytkownika
» 2013-04-10 08:57:41
Dzięki wielkie :)
P-80309
aaadam
Temat założony przez niniejszego użytkownika
» 2013-04-10 16:28:28
mam jeszcze jedno pytanie czy za pomocą timerów można jakoś przyspieszyć działanie aplikacji? Jak za dużo jest pocisków to gra zaczyna się przymulać trochę.
P-80322
1 2 « 3 » 4 5
Poprzednia strona Strona 3 z 5 Następna strona