2010-10-19 19 views
51

Właśnie wraca do używania C++ i próbuje przekonwertować prosty program napisany przeze mnie w języku Java.Co to jest wersja C++ Java ArrayList

Jaki jest preferowany odpowiednik Java ArrayList w C++?

+0

http://stackoverflow.com/questions/14426338/java-arraylist-in-c –

Odpowiedz

66

Użyj std::vector class ze standardowej biblioteki.

+2

Hmmm ... z drugiej odpowiedzi, brzmi jak wektor nie jest zaimplementowany jako lista połączona? Czy mam rację? Używam tej listy jako kolekcji, która będzie miała dość wysoki obrót dodanymi i usuniętymi obiektami. Czy ta macierz jest rzeczywiście najlepszą implementacją? Czy istnieje wersja z listą załączoną? – interstar

+3

@interstar - absolutnie poprawne. Jeśli naprawdę chcesz semantykę z listą odsyłaczy, użyj 'std :: list', ale stracisz indeksowalność (brak operatora []'), więc nie jest to tak naprawdę tablica. 'list', który ma swoją własną idiosynkrazję, tak że' wektor' jest często lepszym wyborem. W standardowych kontenerach C++ będziesz musiał pójść na kompromis w jedną lub w drugą stronę. Spójrz na "deque", które może zaoferować ci lepsze osiągnięcie. Jest to (stosunkowo) łatwe do zmierzenia 'vector' vs' deque' vs 'list', ponieważ są one w dużym stopniu wymienne w kodzie - wystarczy użyć typedef do swojego kontenera np. 'typedef vector MyList'. –

+0

cóż, najpierw spróbuję wektora. Ponieważ indeks jest przydatny. Jeśli jest zbyt wolny, mogę przejść do listy połączonej. Dzięki – interstar

35

Kilka dodatkowych punktów ponownie użyć vector tutaj.

przeciwieństwie ArrayList i Array w Javie, nie musisz robić nic specjalnego do leczenia vector jako Array - instrumentu bazowego przechowywanie w C++ jest gwarantowana być ciągłe i efektywne wiertła.

W przeciwieństwie do ArrayList, vector może wydajnie trzymać typy podstawowe bez hermetyzacji jako pełnoprawnego obiektu.

Podczas usuwania przedmiotów z vector należy pamiętać, że przedmioty nad usuniętym przedmiotem muszą zostać przesunięte w dół, aby zachować przyległą pamięć. To może stać się drogie w przypadku dużych pojemników.

Upewnij się, że przechowujesz złożone obiekty w vector, że ich konstruktor kopiowania i operatory przypisania są wydajne. Pod osłonami C++ STL wykorzystuje je podczas porządkowania kontenerów.

Porada na temat reserve() ing przechowywania z góry (np. W budowie wektorowej lub czas inicjalizacji) w celu zminimalizowania realokacji pamięci na późniejszym rozszerzeniu przenosi się z Java do C++.

+1

Lepsza odpowiedź zdecydowanie powinna być zaakceptowana. –