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++?
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++?
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::list
allerdings 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 ArrayList
a 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.
stackoverflow.com/questions/14426338/java-arraylist-in-c
– Mahesh K
25. Oktober 2016 um 12:45 Uhr