Rozumiem, kiedy używać list, ale nie rozumiem, kiedy lepiej jest używać wektorów niż list w grach wideo: kiedy lepiej mieć szybki losowy dostęp?
(I rozumiem, dlaczego szybciej wstawiać / usuwać listy, ponieważ po prostu usuwa / dodaje wskaźniki, ale wciąż musi znaleźć odpowiedni element ...)
c++
algorithm
data-structure
żart
źródło
źródło
container
.Odpowiedzi:
Moją ogólną zasadą i jestem pewien, że będzie debata na ten temat, to nigdy nie używać list (chyba że trzeba bardzo, bardzo często usuwać rzeczy ze środkowej części dużych list).
Szybkość, którą zyskasz dzięki przechowywaniu wszystkich elementów w kontenerze w ciągłej pamięci (a zatem bardziej przyjaznej dla pamięci podręcznej), jest warta zrównoważenia dodatkowych kosztów dodawania / usuwania / zmiany rozmiaru wektora.
Edycja: Aby wyjaśnić nieco więcej, oczywiście powinno być oczywiste, że każde pytanie „które jest szybsze” powinno być testowane na dowolnej platformie z dowolnymi zestawami danych odpowiadającymi konkretnym potrzebom. Jeśli potrzebuję tylko zbioru elementów, używam po prostu wektora (lub deque, co jest prawie to samo), chyba że istnieje dobry powód, aby tego nie robić .
źródło
Użyj listy, gdy unieważnienie iteratora spowodowane modyfikacją środka struktury danych spowoduje problem lub musisz posortować swoje elementy, aby sztuczka swap i pop dla szybkiego usuwania środkowego zbioru nie działała i masz dużą liczba usuniętych środkowych kolekcji.
Możesz także rozważyć użycie Deque. Ma podobną charakterystykę wydajności do wektora, ale nie potrzebuje wektora ciągłej pamięci i jest nieco bardziej elastyczny.
źródło
Twój wybór powinien odzwierciedlać twoje potrzeby. Wszystkie elementy wektorów mają ciągłą pamięć, a listy mają wskaźniki do następnych / poprzednich elementów, więc każdy ma swoje zalety / wady:
Listy:
Wektory:
Lista jest więc lepsza, gdy program wymaga częstego dodawania i usuwania elementów, ale nigdy nie uzyskuje dostępu (lub rzadko dostępu) do określonego elementu bez potrzeby wcześniejszych. Wektor powinien być używany dla lepszego czasu dostępu, ale brakuje mu skuteczności, gdy trzeba usunąć lub dodać elementy.
Sprawdź ten post na stackoverflow, to przedstawia naprawdę ładny wykres z podstawowymi pytaniami o twoich potrzebach, który prowadzi cię do konkretnego kontenera w zależności od twoich odpowiedzi:
/programming/366432/extending-stdlist
źródło
Zazwyczaj listy są używane w strukturach takich jak kolejki, w których istnieje wiele operacji dołączania i usuwania. Przykład: ciągle zmieniająca się lista encji, które powinny zostać zaktualizowane. Sama lista zawiera tylko elementy na ekranie, dlatego często się zmienia.
Wektory (lub tablice) lepiej nadają się do kolekcji, która niewiele się zmienia i gdzie potrzebujesz szybkiego dostępu do poszczególnych elementów w kolekcji. Przykład: Mapa kafelków, w której należy wyszukać kafelki o danym indeksie.
Opinia Tetrads może być prawdziwa, ale zależy to od używanego języka programowania. Widzę, że otagowałeś swoje pytanie
c++
, ale próbowałem udzielić odpowiedzi, która nie jest specyficzna dla języka.źródło
W grach konsolowych nigdy nie używamy std :: list, ponieważ:
nawet std :: vector traci popularność na konsolach, ponieważ:
źródło
struct point{float x, y, z, w}; std::vector<point> positions;
point
jest to obiekt C ++ (taki jaki jeststd::vector
, tak prosty jakfloat
). Znam rozróżnienie, które próbujesz narysować, ale źle sobie z nim tłumaczysz.