Wie Sie selbst sagten, std::dynarray
handelt es sich um ein dynamisches Array mit fester Größe . Die Größe kann nicht geändert werden. Es ist etwa eine Verbesserung gegenüber zu sprechen new T[N]
und über std::unique_ptr<T[]>(new T[N])
.
Wenn Sie die Größe nicht ändern oder die Kapazität nicht verwalten müssen, können Sie die Datenstruktur mit weniger Komplexität und weniger Platz implementieren.
Darüber hinaus std::dynarray
ist es ein seltsames Tier, das es der Implementierung ermöglicht, es auf verschiedene, unspezifische Arten zu implementieren, z. B. ist es möglich, das Array auf den Stapel zu legen. Das Aufrufen einer Zuordnungsfunktion ist "optional". Sie können einen Allokator angeben, um die Elemente des Arrays zu erstellen, dies ist jedoch nicht Teil des Typs.
Sie fragen sich vielleicht auch , warum wir brauchen std::dynarray
und Arrays variabler Länge. VLAs in C ++ 14 sind viel restriktiver. Sie können nur lokale, automatische Variablen sein und bieten keine Möglichkeit, eine Zuordnungsrichtlinie anzugeben, und natürlich haben sie keine Standard-Containerschnittstelle.
Einige Beispiele aus 23.3.4.2 eines "aktuellen Entwurfs" (nehmen Sie das, Google Cache):
explicit dynarray(size_type c);
Effekte: Ordnet Speicher für c
Elemente zu. Kann oder kann nicht das globale aufrufen operator new
.
template <class Alloc>
dynarray(size_type c, const Alloc& alloc);
Effekte: Entspricht den vorhergehenden Konstruktoren, außer dass jedes Element mit einer Verwendungszuweisungskonstruktion erstellt wird .
Ob Sie einen bestimmten Allokator zum Erstellen der Array-Elemente verwenden können oder nicht, ist ein globales Merkmal:
Template-Struktur use_allocator, Alloc>: true_type {};
Benötigt: Alloc
muss ein Allokator sein (17.6.3.5). [ Hinweis: Durch die Spezialisierung dieses Merkmals werden andere Bibliothekskomponenten informiert, dynarray
die mit einem Allokator erstellt werden können, obwohl dieser keinen verschachtelten Allokatortyp hat.]
Bearbeiten: Jonathan Wakelys Antwort wird sicherlich viel maßgeblicher und aufschlussreicher sein.