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::vectorKlasse aus der Standardbibliothek.
std::list, aber dann verlieren Sie die Indexierbarkeit (nein operator[]), sodass es sich nicht wirklich um ein Array handelt. listdas hat seine eigenen eigenheiten, so dass vectoroft 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, vectorvs dequevs zu messen, listda 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 vectormöglicherweise immer noch schneller als listwenn 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 ArrayListund Arrayin Java müssen Sie nichts Besonderes tun, um vectorein Array zu behandeln. Der zugrunde liegende Speicher in C ++ ist garantiert zusammenhängend und effizient indizierbar.
Im Gegensatz zu ArrayList, ein vectoreffizienten 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, vectordass 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.