10 Stimmen

Wurde Boost.Pointer Container durch std::unique_ptr in C++11/14 überflüssig gemacht?

Macht std::unique_ptr die Boost.Pointer-Container-Bibliothek in C++11/14 überflüssig?

In C++98/03 gibt es keine Umzugssemantik, und ein intelligenter Zeiger wie shared_ptr hat bezogene Overhead-Kosten (sowohl für den Referenz-Block als auch für die interlocked-Inkrementierung/Dekrementierung), im Vergleich zu rohen Zeigern. Also hat etwas wie std::vector> Overhead im Vergleich zu std::vector.

Aber ist std::vector> genauso effizient wie std::vector (kein Overhead durch Referenz-Zählung), und zusätzlich sicher im Hinblick auf Ausnahmen und automatische Zerstörung (d.h. der Destruktor von vector> ruft automatisch die Destruktoren für die T-Elemente auf, deren Zeiger im vector gespeichert sind)?

Falls ja, hat Boost.Pointer Container immer noch einen gültigen und nützlichen Platz im C++11/14-Code, oder ist er einfach überholt?

11voto

James Kanze Punkte 146902

Es ist nicht veraltet; es hat eine völlig andere und intuitivere Oberfläche als std::vector>.

7voto

Praetorian Punkte 103296

Wie James in seiner Antwort erwähnt, bieten die Boost.Pointer-Behälter eine intuitivere Schnittstelle im Vergleich zu dem, was Sie erhalten, wenn Sie ein unique_ptr in einen Standardbibliothekscontainer einfügen.

Abgesehen davon speichert boost::ptr_vector (und Freunde) den darauf zeigenden Typ darunter als void *, sodass Sie nicht für jedes T eine komplette Klassenvorlageninstanziierung erhalten. Dies ist nicht der Fall bei vector>.

1voto

xinnjie Punkte 612

Versuchen Sie, std::vector> zu verwenden

struct Foo {
    int a;
};

vector> bar;
bar.push_back(make_unique(1));
cout << bar[0]->a << endl; // rvalue, ist ok
Foo *foo = bar[1].get(); // Versuchen Sie, einen Zeiger zu verwenden, diese Schnittstelle "bar[1].get()" ist schrecklich

Boost.Pointer Container hat sicherlich eine intuitivere Schnittstelle.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X