usuwanie elementów w std::vector
Ostatnio zmodyfikowano 2024-02-10 23:10
tBane Temat założony przez niniejszego użytkownika |
usuwanie elementów w std::vector » 2024-02-09 16:16:14 Witam. Stworzyłem listę elementów przy pomocy kontenera std::vector < unit* > units. Jak z takiego kontenera usunąć unit* ? |
|
DejaVu |
» 2024-02-09 16:27:19 Przeszukać cały kontener w poszukiwaniu wskaźnika unit*. Chyba, że wiesz, który element chcesz usunąć, to wówczas możesz użyć metody: units.erase( units.begin() + numerElementu );
Niemniej jednak złożoność obliczeniowa będzie liniowa O(n), więc Twój koncept może być z założenia zły, aby wykorzystywać std::vector do przechowywania jednostek (jeżeli planujesz mieć ich bardzo dużo). |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-02-09 16:30:39 hmm... a jest jakiś inny kontener, który w prostszy sposób pozwoliłby usunąć element przy pomocy wskaźnika ? |
|
pekfos |
» 2024-02-09 20:20:17 Zgaduję że chodzi o grę i tu typowym rozwiazaniem jest tzw. mark & sweep. Niech unit ma flagę oznaczającą że obiekt ma być usunięty. W trakcie aktualizacji stanu gry usuwasz wszystkie oznaczone elementy, np przez std::remove_if(). Generalnie nie chcesz usuwać obiektu od razu, bo jeśli postanowisz usunąć wszystkie to będziesz mieć kwadratową liczbę kroków. Musiałbyś też zachować ostrożność jeśli usuwanie może nastąpić w trakcie iterowania po tym wektorze (to by dotyczyło również dodawania obiektów). |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-02-09 20:38:03 na razie to zamiast usuwać elementy, czyszczę listę i dodaje wszystkie pozostałe elementy raz jeszcze. Dlatego szukam jakiejś wygodnej alternatywy, ew. zmianę kontenera - jeśli jakiś znasz i może być użyteczniejszy niż std::vector to chętnie przyjmę radę.
Ale tak, w ten sposób zazwyczaj usuwałem elementy ale to w "ręcznie utworzonej liście jednokierunkowej", a stosowanie takiej mi odradzałeś ze względu na wolne działanie. |
|
pekfos |
» 2024-02-10 13:27:31 Ale tak, w ten sposób zazwyczaj usuwałem elementy ale to w "ręcznie utworzonej liście jednokierunkowej", a stosowanie takiej mi odradzałeś ze względu na wolne działanie. A co ma piernik do wiatraka? Wolne działanie to nie jedyny problem tutaj i sporo zależy od kontekstu. Jakby myśleć wyłącznie o jednym aspekcie o jaki pytasz, to bym powiedział żebyś nie używał kontenera w ogóle, bo skoro chcesz z niego tylko usuwać elementy to będzie zawsze pusty. |
|
tBane Temat założony przez niniejszego użytkownika |
» 2024-02-10 13:31:24 to co w takim razie używać ? |
|
pekfos |
» 2024-02-10 13:41:28 A co chcesz osiągnąć? |
|
« 1 » 2 |