Ich kann dem Geist der akzeptierten Antwort nicht stark genug widersprechen. "Ein Werkzeug der letzten Instanz"? Weit davon entfernt!
Aus meiner Sicht ist eines der stärksten Merkmale von C ++ im Vergleich zu C und einigen anderen ähnlichen Sprachen die Fähigkeit, Einschränkungen auszudrücken, damit sie beim Kompilieren überprüft und ein versehentlicher Missbrauch verhindert werden kann. Fragen Sie sich beim Entwerfen einer Struktur, welche Operationen dies zulassen soll. Alle anderen Verwendungen sollten verboten werden, und es ist am besten, wenn solche Einschränkungen statisch (zur Kompilierungszeit) implementiert werden können, damit ein Missbrauch zu einem Kompilierungsfehler führt.
Wenn man also ein Array benötigt, geben die Antworten auf die folgenden Fragen sein Verhalten an: 1. Ist seine Größe a) zur Laufzeit dynamisch oder b) statisch, aber nur zur Laufzeit bekannt, oder c) statisch und zur Kompilierungszeit bekannt? 2. Kann das Array auf dem Stapel zugewiesen werden oder nicht?
Und basierend auf den Antworten sehe ich dies als die beste Datenstruktur für ein solches Array:
Dynamic | Runtime static | Static
Stack std::vector unique_ptr<T[]> std::array
Heap std::vector unique_ptr<T[]> unique_ptr<std::array>
Ja, ich denke, unique_ptr<std::array>
sollte auch in Betracht gezogen werden, und keines ist ein Werkzeug der letzten Instanz. Denken Sie nur daran, was am besten zu Ihrem Algorithmus passt.
Alle diese sind mit einfachen C-APIs über den Rohzeiger auf das Datenarray ( vector.data()
/ array.data()
/ uniquePtr.get()
) kompatibel .
PS Abgesehen von den oben genannten Überlegungen gibt es auch eine der Eigentumsverhältnisse: std::array
und std::vector
eine Wertsemantik (native Unterstützung für das Kopieren und Übergeben von Werten), unique_ptr<T[]>
die nur verschoben werden kann (erzwingt Einzelbesitz). Beides kann in verschiedenen Szenarien nützlich sein. Im Gegenteil, einfache statische Arrays ( int[N]
) und einfache dynamische Arrays ( new int[10]
) bieten keine und sollten daher nach Möglichkeit vermieden werden - was in den allermeisten Fällen möglich sein sollte. Wenn dies nicht ausreicht, bieten einfache dynamische Arrays auch keine Möglichkeit, ihre Größe abzufragen - zusätzliche Möglichkeit für Speicherbeschädigungen und Sicherheitslücken.
std::shared_ptr<T[]>
, aber es sollte und wahrscheinlich in C ++ 14 geben wird, wenn sich jemand die Mühe machen könnte, einen Vorschlag zu verfassen. In der Zwischenzeit gibt es immerboost::shared_array
.