webentwicklung-frage-antwort-db.com.de

Was ist der Unterschied zwischen std :: array und std :: vector? Wann verwendest du eins über anderen?

Was ist der Unterschied zwischen std::array und std::vector? Wann verwendest du eins über anderen?

Ich habe std:vector immer als C++ - Methode für die Verwendung von C-Arrays verwendet und betrachtet. Was ist also der Unterschied?

114
Alok Save

std::array ist nur eine Klassenversion des klassischen C-Arrays. Das heißt, seine Größe ist zur Kompilierzeit festgelegt und wird als einzelner Block zugewiesen (z. B. nimmt Platz auf dem Stapel ein). Der Vorteil ist eine etwas bessere Leistung, da zwischen dem Objekt und den Array-Daten keine Verschiebung besteht.

std::vector ist eine kleine Klasse, die Zeiger in den Heap enthält. (Wenn Sie also einen std::vector zuweisen, ruft er immer new auf.) Der Zugriff ist etwas langsamer, da diese Zeiger gejagt werden müssen, um zu den Array-Daten zu gelangen. Im Gegenzug können sie jedoch in der Größe geändert werden eine unbedeutende Menge an Stapelplatz, egal wie groß sie sind.

[bearbeiten]

Wenn Sie eine über der anderen verwenden, ist std::vector fast immer das, was Sie wollen. Das Erstellen großer Objekte auf dem Stapel ist im Allgemeinen verpönt, und die zusätzliche Ebene der Indirektion ist normalerweise irrelevant. (Wenn Sie beispielsweise alle Elemente durchlaufen, wird der zusätzliche Speicherzugriff nur einmal zu Beginn der Schleife ausgeführt.)

Die Elemente des Vektors sind garantiert zusammenhängend. Sie können also &vec[0] an jede Funktion übergeben, die einen Zeiger auf ein Array erwartet. B. C-Bibliotheksroutinen. (Nebenbei gesagt ist std::vector<char> buf(8192); eine großartige Möglichkeit, einen lokalen Puffer für Aufrufe von read/write oder ähnlichem zuzuordnen, ohne new direkt aufzurufen.)

Das heißt, das Fehlen dieser zusätzlichen Ebene der Indirektion sowie die konstante Größe der Kompilierungszeit können std::array für ein sehr kleines Array, das viel erstellt/zerstört/abgerufen wird, erheblich beschleunigen.

Mein Rat wäre also: Verwenden Sie std::vector, es sei denn (a) Ihr Profiler sagt Ihnen, dass Sie ein Problem haben und (b) das Array ist winzig.

150
Nemo

Ich gehe davon aus, dass Sie wissen, dass std :: array die Größe der Kompilierzeit festlegt, während std :: vector eine variable Größe hat. Ich gehe auch davon aus, dass Sie wissen, dass std :: array keine dynamische Zuweisung vornimmt. Stattdessen antworte ich warum Sie würden std :: array anstelle von std :: vector verwenden.

Hast du dich jemals dabei gefunden:

std::vector<SomeType> vecName(10);

Und dann vergrößern Sie nie wirklich den std :: vector? Wenn ja, dann ist std :: array eine gute Alternative.

In Wirklichkeit gibt es std :: array (gekoppelt mit Initialisierungslisten), um Arrays im C-Stil fast völlig wertlos zu machen. Sie konkurrieren im Allgemeinen nicht mit std :: Vectors; Sie konkurrieren mehr mit Arrays im C-Stil.

Betrachten Sie es als das C++ - Komitee, das sein Bestes tut, um fast jeden legitimen Gebrauch von Arrays im C-Stil zu beenden.

21
Nicol Bolas

std::array 

  • ist ein Aggregat
  • hat eine feste Größe
  • erfordert, dass seine -Elemente standardmäßig konfigurierbar sind (vs Kopie (C++ 03) oder move (C++ 0x)
  • ist linear austauschbar (vs Zeitkonstante)
  • ist linear beweglich (gegen konstante Zeit)
  • zahlt möglicherweise eine weniger Dereferenzierung als std::vector

Ein guter Anwendungsfall ist, wenn Sie Dinge "nahe am Metall" tun, dabei die Feinheiten von C++ und alle schlechten Dinge von rohen Arrays fernhalten.

14
Luc Danton

Gleiche Begründung bei Verwendung eines static - Arrays im C-Stil anstelle eines std::vector Und dazu verweise ich Sie freundlich auf hier .

9
Xeo

std::array hat eine feste Größe (Kompilierzeit), während std::vector wachsen kann.

Daher ist std::array wie ein C-Array, während std::vector wie die dynamische Zuweisung von Speicher ist.

8

Ich verwende meine eigene, handcodierte Vorlagenklasse Array<>, die im Vergleich zu std::array oder std::vector eine einfachere API hat. Zum Beispiel: 

So verwenden Sie ein dynamisches Array:

Array<>  myDynamicArray; // Note array size is not given at compile time
myDynamicArray.resize(N); // N is a run time value

...

So verwenden Sie ein statisches Array mit fester Größe zur Kompilierzeit:

Array<100> myFixedArry;

Ich glaube, es hat eine bessere Syntax als std::array oder std::vector. Auch äußerst effizient. 

2
Xiang

Vektoren haben gegenüber Arrays den Vorteil, dass es möglich ist, diecurrent sizeeines Vektors mit vector_name.size () zu finden.

Wie Sie sich vorstellen können, können wir dies in verschiedenen Situationen sehr nützlich machen, in denen Sie die Anzahl der Elemente in der array_list einfach abrufen können.

0
tech_boy