Was ist die C++-Version von Javas ArrayList

Lesezeit: 3 Minuten

Ich komme gerade wieder in die Verwendung von C++ und versuche, ein einfaches Java-Programm zu konvertieren, das ich kürzlich geschrieben habe.

Was ist das bevorzugte Äquivalent zu Java ArrayList in C++?

  • stackoverflow.com/questions/14426338/java-arraylist-in-c

    – Mahesh K

    25. Oktober 2016 um 12:45 Uhr

Benutzer-Avatar
SLaks

Verwenden Sie die std::vector Klasse aus der Standardbibliothek.

  • Hmmm … aus der anderen Antwort klingt es so, als ob Vektor nicht als verknüpfte Liste implementiert ist? Habe ich recht? Ich verwende diese Liste als eine Sammlung, die einen ziemlich hohen Umsatz an hinzugefügten und entfernten Objekten aufweisen wird. Ist dieses Array tatsächlich die beste Implementierung? Oder gibt es eine Linked-List-Version?

    – interstar

    19. Oktober 2010 um 19:53 Uhr

  • @interstar – absolut richtig. Wenn Sie wirklich eine verkettete Listensemantik wollen, dann verwenden Sie std::listallerdings verliert man dann die Indexierbarkeit (Nr operator[]), also ist es nicht wirklich ein Array. list das hat so seine eigenheiten vector ist oft die bessere Wahl. In Standard-C++-Containern müssen Sie auf die eine oder andere Weise Kompromisse eingehen. Ansehen deque, die möglicherweise eine bessere Leistung für Sie bieten. Es ist (relativ) einfach zu messen vector vs deque vs list da sie im Code weitgehend austauschbar sind – verwenden Sie einfach eine Typedef für Ihren Container, z typedef vector<MyObj> MyList.

    – Steve Townsend

    19. Oktober 2010 um 19:57 Uhr


  • Nun, ich werde es zuerst mit dem Vektor versuchen. Weil der Index nützlich ist. Wenn es zu langsam ist, kann ich zur verknüpften Liste wechseln. Vielen Dank

    – interstar

    19. Oktober 2010 um 23:14 Uhr

  • @interstar, ArrayList, wie Sie vielleicht anhand des Namens erraten können, ist auch nicht als verkettete Liste implementiert. Sie denken vielleicht an LinkedList. Auch wenn Sie eine ziemlich hohe Anzahl von Objekten hinzufügen und von der Liste entfernen, vector könnte immer noch schneller sein als list solange Sie ihm anfangs genügend Speicherplatz zuweisen, den er nicht neu zuweisen muss (dh ihm den maximalen Speicherplatz geben, den er jemals benötigen sollte).

    – Kyle Strand

    23. April 2013 um 19:31 Uhr

  • @interstar das hab ich jetzt auch bei dir gelernt tun Neuzuweisung benötigen, ist Array-ähnliche Speicherung still fast immer schneller als verknüpfte Listen. Verkettete Listen sind ein nettes Programmierkonzept, aber in der Praxis sind sie im Grunde sinnlos.

    – Kyle Strand

    23. Februar 2015 um 17:45 Uhr

Ein paar zusätzliche Punkte zur Wiederverwendung vector hier.

nicht wie ArrayList und Array in Java müssen Sie nichts Besonderes tun, um a zu behandeln vector als Array – der zugrunde liegende Speicher in C++ ist garantiert zusammenhängend und effizient indizierbar.

nicht wie ArrayLista vector kann primitive Typen effizient ohne Kapselung als vollwertiges Objekt halten.

Beim Entfernen von Elementen aus a vector, beachten Sie, dass die Elemente über dem entfernten Element nach unten verschoben werden müssen, um einen zusammenhängenden Speicher zu erhalten. Bei großen Containern kann das teuer werden.

Stellen Sie sicher, wenn Sie komplexe Objekte in der speichern vector dass ihr Kopierkonstruktor und ihre Zuweisungsoperatoren effizient sind. Unter der Decke verwendet C++ STL diese während der Containerverwaltung.

Ratschläge über reserve()Speichern im Voraus (dh zum Zeitpunkt der Vektorkonstruktion oder Initialisierung), um die Neuzuweisung von Speicher bei späteren Erweiterungsüberträgen von Java nach C++ zu minimieren.

  • Die bei weitem bessere Antwort sollte die akzeptierte sein.

    – Paul Rooney

    16. August 2016 um 23:56 Uhr

Wie andere Antworten ist die nächste std::vector.

Aber es gibt eine wichtige Sache zu beachten, Raumkomplexität.

Der C++-Vektor hat eine Compiler-abhängige Berechnung, wenn die aktuelle Kapazität voll ist. Wenn die Kapazität voll ist, erhöhen einige Compiler die Vektorkapazität exponentiell und einige locker exponentiell.

Für die Java-Arrayliste gibt es keine genauen Angaben von Standards zur Neuberechnung der Kapazität, wenn sie voll ist. Einige haben eine grobe Berechnung von 150% plus eins. Bin mir aber nicht sicher, ob das die exakte Berechnung ist.

1256280cookie-checkWas ist die C++-Version von Javas ArrayList

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy