Cóż, uczniowie mojej klasy wydają się całkiem niezdolni do wyjaśnienia mi, kiedy bardziej efektywne jest stosowanie wektorów, ale wyglądają na całkiem zadowolonych, gdy doradzają mi korzystanie z list.
Tak to rozumiem
Listy : Każdy element zawiera adres do następnego lub poprzedniego elementu, więc dzięki tej funkcji możesz losowo losować elementy, nawet jeśli nie zostaną posortowane, kolejność się nie zmieni: jest wydajna, jeśli pamięć jest podzielona. Ale ma też jeszcze jedną bardzo dużą zaletę: możesz łatwo wstawiać / usuwać elementy, ponieważ jedyne, co musisz zrobić, to zmienić niektóre wskaźniki. Wada: Aby odczytać losowy pojedynczy element, musisz przeskakiwać z jednego elementu na drugi, aż znajdziesz właściwy adres.
Wektory : Podczas korzystania z wektorów pamięć jest znacznie bardziej zorganizowana jak zwykłe tablice: każdy n-ty element jest przechowywany tuż po (n-1) i przed (n + 1) element. Dlaczego to jest lepsze niż lista? Ponieważ umożliwia szybki losowy dostęp. Oto jak: jeśli znasz rozmiar elementu w wektorze i jeśli są one ciągłe w pamięci, możesz łatwo przewidzieć, gdzie jest n-ty element; nie musisz przeglądać wszystkich pozycji na liście, aby przeczytać ten, który chcesz, z wektorem, bezpośrednio go czytasz, z listą, której nie możesz. Z drugiej strony, zmodyfikuj tablicę wektorową lub zmień wartość o wiele wolniej.
Listy są bardziej odpowiednie do śledzenia obiektów, które można dodawać / usuwać w pamięci. Wektory są bardziej odpowiednie, gdy chcesz uzyskać dostęp do elementu z dużej liczby pojedynczych elementów.
Nie wiem, w jaki sposób listy są zoptymalizowane, ale musisz wiedzieć, że jeśli chcesz szybkiego dostępu do odczytu, powinieneś używać wektorów, ponieważ jak dobre listy połączeń STL nie będą tak szybkie w dostępie do odczytu niż wektor.