Po prostu wracam do używania C ++ i próbuję przekonwertować prosty program Java, który niedawno napisałem.
Jaki jest preferowany odpowiednik Java ArrayList w C ++?
Odpowiedzi:
Użyj std::vector
klasy z biblioteki standardowej.
std::list
, chociaż wtedy tracisz indeksowalność (nie operator[]
), więc tak naprawdę nie jest to tablica. list
który ma swoje własne cechy charakterystyczne, które vector
często są lepszym wyborem. W standardowych kontenerach C ++ będziesz musiał pójść na kompromis w taki czy inny sposób. Spójrz deque
, to może zaoferować ci lepszą wydajność. Jest (stosunkowo) łatwy do zmierzenia vector
vs deque
vs, list
ponieważ są one w dużej mierze wymienne w kodzie - po prostu użyj typedef dla swojego kontenera, np typedef vector<MyObj> MyList
.
ArrayList
jak można się domyślić z nazwy, również nie jest zaimplementowana jako lista połączona. Możesz o tym pomyśleć LinkedList
. Ponadto, nawet jeśli masz dość dużą rotację obiektów dodawanych i usuwanych z listy, vector
może to być szybsze niż list
tak długo, jak na początku przydzielisz wystarczającą ilość miejsca, aby nie trzeba było ponownie przydzielać (tj. maksymalnej przestrzeni, jakiej kiedykolwiek potrzebował).
Kilka dodatkowych punktów ponownie wykorzystaj vector
tutaj.
W przeciwieństwie ArrayList
oraz Array
w Javie, nie musisz robić nic specjalnego traktować vector
jako tablicę - bazowego przechowywanie w C ++ jest gwarantowana być ciągłe i efektywne wiertła.
W przeciwieństwie do tego ArrayList
, a vector
może skutecznie przechowywać typy pierwotne bez hermetyzacji jako pełnoprawny obiekt.
Podczas usuwania elementów z pliku vector
należy pamiętać, że elementy powyżej usuniętego elementu muszą zostać przesunięte w dół, aby zachować ciągłe przechowywanie. W przypadku dużych pojemników może to być kosztowne.
Upewnij się, że jeśli przechowujesz złożone obiekty w tym, vector
że ich konstruktor kopiujący i operatory przypisania są wydajne. Pod osłonami C ++ STL używa ich podczas porządkowania kontenerów.
Porady dotyczące umieszczania reserve()
pamięci z góry (tj. Podczas konstruowania wektora lub czasu inicjalizacji), aby zminimalizować realokację pamięci przy późniejszych rozszerzeniach, są przenoszone z języka Java na C ++.