std::vector
ist eine Vorlagenklasse , die ein im Heap gespeichertes dynamisches Array 1 kapselt , das automatisch wächst und schrumpft, wenn Elemente hinzugefügt oder entfernt werden. Es bietet alle Haken ( begin()
, end()
, Iteratoren, usw.) , die es funktioniert gut mit dem Rest der STL. Es gibt auch einige nützliche Methoden, mit denen Sie Operationen ausführen können, die für ein normales Array umständlich wären, z. B. das Einfügen von Elementen in die Mitte eines Vektors (es übernimmt die gesamte Arbeit, die folgenden Elemente hinter die Kulissen zu verschieben).
Da die auf dem Heap zugewiesenen Elemente im Speicher gespeichert werden, hat dies einen gewissen Overhead in Bezug auf statische Arrays.
std::array
ist eine Vorlagenklasse, die ein statisch großes Array kapselt, das im Objekt selbst gespeichert ist. Wenn Sie also die Klasse auf dem Stapel instanziieren, befindet sich das Array selbst auf dem Stapel. Seine Größe muss zur Kompilierungszeit bekannt sein (es wird als Vorlagenparameter übergeben) und kann nicht wachsen oder schrumpfen.
Es ist begrenzter als std::vector
, aber es ist oft effizienter, insbesondere für kleine Größen, da es in der Praxis meistens eine leichte Hülle um ein Array im C-Stil ist. Es ist jedoch sicherer, da die implizite Konvertierung in einen Zeiger deaktiviert ist und einen Großteil der STL-bezogenen Funktionen der std::vector
und der anderen Container bereitstellt , sodass Sie sie problemlos mit STL-Algorithmen & Co. verwenden können. Wie auch immer, für die Begrenzung der festen Größe ist es viel weniger flexibel als std::vector
.
Eine Einführung zu std::array
finden Sie in diesem Artikel . Für eine schnelle Einführung in std::vector
und in die Operationen, die darauf möglich sind, sollten Sie sich die Dokumentation ansehen .
Tatsächlich denke ich, dass sie im Standard im Hinblick auf die maximale Komplexität der verschiedenen Operationen beschrieben werden (z. B. Direktzugriff in konstanter Zeit, Iteration über alle Elemente in linearer Zeit, Hinzufügen und Entfernen von Elementen am Ende in konstanter Amortisationszeit). usw.), aber AFAIK gibt es keine andere Methode, um solche Anforderungen zu erfüllen, als die Verwendung eines dynamischen Arrays. Wie von @Lucretiel angegeben, verlangt der Standard tatsächlich, dass die Elemente zusammenhängend gespeichert werden. Es handelt sich also um ein dynamisches Array, das dort gespeichert wird, wo der zugehörige Allokator es platziert.
std::vector
vs.std::array
und wie sich die Begriffe unterscheiden.