Ja,
std::unique_ptr isst bei ein zeitgemäßen Compiler absolut ohne Overhead. Die Klasse enthält im Prinzip einfach bloß den Zeiger und löscht ihn im Destruktor. Das selbe was man auch selbst machen würde. Also kein Overhead.
Geteilte Besitzverhältnisse sind sehr selten und auch kein Grund dagegen. In dem Fall muss man zwar
std::shared_ptr verwenden, aber Raw Pointer sind doch noch weiter vom Nutzungsmuster entfernt. Für Raw Pointer die ein Objekt besitzen gibt es eigentlich keinen Grund.
Also ich habe so mitbekommen, dass vector die beliebteste Datenstruktur der STL für 1-dimensionale Container ist. Hat das einen Grund warum z.B. nicht list oder deque bevorzugt wird?
BlueCobold hat schon die theoretischen Aspekte beleuchtet. In der Praxis sieht es auch so aus, dass es nie oder extrem selten vorkommt, dass man die Eigenschaften benötigt, bei denen die
std::list oder
std::deque glänzt. Selbst bei der Worst Case Verwendung der
std::list überholt sie den
std::vector erst bei einigen tausenden durchschnittlichen Elementen. Das kommt von dem hohen Overhead durch die vielen einzelnen Allokationen. Zudem kann man in der Praxis den Zugriff meistens einfach so umformen, dass man auch bei dem
std::vector ohne die potentiell teuren Operationen auskommt.(Zum Beispiel ein zu löschendes Element nicht löschen sondern mit den letzten tauschen) Außerdem ist die
std::list durch Caching Effekte
wesentlich langsamer beim Iterieren. Klar, die Elemente sind wild im Speicher verteilt und hinter n Pointern versteckt, während sie beim
std::vector direkt hintereinander liegen. Meine Empehlung ist: Immer
std::vector nehmen.
Nebenbei möchte ich noch die Möglichkeit von Arrays in Smart Pointern hinweisen:
std::unique_ptr<T[]>