Kontener struktur vector, usuwanie
Ostatnio zmodyfikowano 2017-01-02 21:10
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. |
|
sebox Temat założony przez niniejszego użytkownika |
» 2017-01-02 19:17:15 To znaczy, że prawdopodobnie, źle to zrobiłem? std::vector < Sprite > pocisk; std::vector < Vector2f > coordinates;
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. |
|
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 |
|
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. |
|
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 |
|
1 « 2 » |