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::vectorklasy z biblioteki standardowej.
std::list, chociaż wtedy tracisz indeksowalność (nie operator[]), więc tak naprawdę nie jest to tablica. listktóry ma swoje własne cechy charakterystyczne, które vectorczę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 vectorvs dequevs, listponieważ są one w dużej mierze wymienne w kodzie - po prostu użyj typedef dla swojego kontenera, np typedef vector<MyObj> MyList.
ArrayListjak 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, vectormoże to być szybsze niż listtak 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 vectortutaj.
W przeciwieństwie ArrayListoraz Arrayw Javie, nie musisz robić nic specjalnego traktować vectorjako tablicę - bazowego przechowywanie w C ++ jest gwarantowana być ciągłe i efektywne wiertła.
W przeciwieństwie do tego ArrayList, a vectormoż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 ++.