Ich komme gerade wieder in C ++ und versuche, ein einfaches Java-Programm zu konvertieren, das ich kürzlich geschrieben habe.
Was ist das bevorzugte Äquivalent zur Java ArrayList in C ++?
Antworten:
Verwenden Sie die std::vector
Klasse aus der Standardbibliothek.
std::list
, aber dann verlieren Sie die Indexierbarkeit (nein operator[]
), sodass es sich nicht wirklich um ein Array handelt. list
das hat seine eigenen eigenheiten, so dass vector
oft eine bessere wahl ist. In Standard-C ++ - Containern müssen Sie auf die eine oder andere Weise Kompromisse eingehen. Schauen Sie deque
, das könnte eine bessere Leistung für Sie bieten. Es ist (relativ) einfach, vector
vs deque
vs zu messen, list
da sie im Code weitgehend austauschbar sind - verwenden Sie einfach ein typedef für Ihren Container, z typedef vector<MyObj> MyList
.
ArrayList
, wie Sie vielleicht anhand des Namens erraten können, auch nicht als verknüpfte Liste implementiert. Sie könnten daran denken LinkedList
. Auch wenn Sie einen relativ hohen Umsatz an Objekten haben, die der Liste hinzugefügt und daraus entfernt wurden, ist dies vector
möglicherweise immer noch schneller als list
wenn Sie anfangs genügend Speicherplatz dafür zuweisen, damit es nicht neu zugewiesen werden muss (dh geben Sie ihm die maximaler Platz, den es jemals brauchen sollte).
Ein paar zusätzliche Punkte werden hier wiederverwendet vector
.
Im Gegensatz zu ArrayList
und Array
in Java müssen Sie nichts Besonderes tun, um vector
ein Array zu behandeln. Der zugrunde liegende Speicher in C ++ ist garantiert zusammenhängend und effizient indizierbar.
Im Gegensatz zu ArrayList
, ein vector
effizienten Urtyp ohne Einkapselung als vollwertiges Objekt halten.
Beachten Sie beim Entfernen von Elementen aus a vector
, dass die Elemente über dem entfernten Element nach unten verschoben werden müssen, um die zusammenhängende Speicherung zu erhalten. Dies kann bei großen Containern teuer werden.
Stellen Sie beim Speichern komplexer Objekte sicher, vector
dass deren Kopierkonstruktor und Zuweisungsoperatoren effizient sind. Unter der Decke verwendet C ++ STL diese während der Containerverwaltung.
Hinweise zur reserve()
Speicherung im Voraus (dh zur Vektorkonstruktion oder zur Initialisierungszeit) zur Minimierung der Speicherumverteilung bei einer späteren Erweiterung werden von Java auf C ++ übertragen.