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

Kontener struktur vector, usuwanie

Ostatnio zmodyfikowano 2017-01-02 21:10
Autor Wiadomość
michal11
» 2017-01-02 19:07:06
Znowu, bez szerszego kontekstu można tylko zgadywać, być może przypadek, że nie jest usuwane za dużo elementów i nigdy nie wychodzi poza zakres vectora.
P-155825
sebox
Temat założony przez niniejszego użytkownika
» 2017-01-02 19:17:15
To znaczy, że prawdopodobnie, źle to zrobiłem?
C/C++
std::vector < Sprite > pocisk;
std::vector < Vector2f > coordinates;
C/C++
for( int j = 0; j < pocisk.size(); j++ )
{
    FloatRect box2 = player.getGlobalBounds();
    FloatRect box3( 1, 1, pocisk[ j ].getPosition().x, pocisk[ j ].getPosition().y );
    if( box2.intersects( box3 ) )
    {
        pocisk.erase( pocisk.begin() + j );
        coordinates.erase( coordinates.begin() + j );
    }
}
Tutaj również sprawdzam kolizje, tyle, że po stronie clienta. Podczas strzału ładuję sprite do pocisku z odpowiednią rotacją i położeniem, w coordinates mam współczynnik kierunkowy. Jeśli dobrze rozumiem to używanie "erase" jest złą praktyką? Gdy sprawdziłem ile wynosi np: pocisk.size(), to gdy nie strzelam, wynosi 0. Ot zagwozdka.
P-155827
mokrowski
» 2017-01-02 19:46:42
Źle zrozumiałeś. Używanie erase() to normalna praktyka jeśli wie się że następuje naruszenie ciągłości interatorów i zna się idiom erase-remove. Po każdym erase() "sypie ci się" index i i nie jest już aktualny. Metoda erase() usunie element i ..... gdzie ma wtedy wskazywać i ? A jakie jest maksymalne i ? No właśnie. Zmienia się size() kontenera (po erase) i należy te i przeliczyć (podpowiem że zmniejszyć o 1 tak samo i w następnym przebiegu jak i "maksymalne i" do którego będzie realizowana pętla. Myślę że jesteś w stanie to napisać ale.. sam zobaczysz że kod jaki Ci wyjdzie będzie mało czytelny. Stąd.. lepiej idiomem :-)
Do poczytania:
https://en.wikibooks.org/wiki​/More_C%2B%2B_Idioms
P-155829
michal11
» 2017-01-02 20:26:21
Dodatkowo takie pojedyncze usuwanie jest niewydajne, zakładając pesymistycznie, że wszystkie elementy vectora zostaną usunięte, masz n przesunięć wewnątrz wektora, dodatkowo, ponieważ trzymasz obiekty w vectorze to będziesz miał masę wywołań destruktorów i konstruktorów. Dlatego wydajniej jest najpierw oznaczyć sobie wszystkie obiekty do skasowania i na koniec zrobić jedno duże usunięcie danych.
P-155832
sebox
Temat założony przez niniejszego użytkownika
» 2017-01-02 21:10:35
Ok teraz czaję, dzięki za pomoc i poświęcony czas
P-155838
1 « 2 »
Poprzednia strona Strona 2 z 2