Frage Warum gibt es in C ++ 11 keinen Vektor (size_type n, const Allocator & alloc)?


In C ++ 11 hat std :: vector den Konstruktor vector(size_type n) welches wird standardmäßig konstruieren n Elemente an Ort und Stelle, die mit standardkonstruierbaren, beweglichen, nicht kopierbaren Klassen verwendet werden können.

Im Gegensatz zu jedem anderen Vektorkonstruktor gibt es jedoch keine Variante, die einen Zuordner benötigt, und ich habe auf Folgendes zurückgegriffen:

// Foo is default constructible and moveable, but not copyable
const int n = 10; // Want 10 default constructed Foos
std::vector<Foo, CustomAllocator> foos(allocator);
foos.reserve(n);
for (int i = 0; i < n; ++i)
   foos.emplace_back();

Gibt es einen besseren Weg, dies zu erreichen? Gibt es einen bestimmten Grund? vector(size_type n, const Allocator& alloc) wurde aus dem Standard weggelassen?


6
2018-02-23 22:24


Ursprung


Antworten:


Nachdem ich darüber nachgedacht habe, ist es vielleicht kein Defekt mehr.

Es ist möglich, dass allocator_type und value_type sind pervers das Gleiche Art. In diesem Fall würde welche Funktion vector(3, alloc) Anruf? Der Konstruktor, der einen Standardwert für die Initialisierung in alle Elemente kopiert, oder für den, der eine Größe und einen Zuordner benötigt? Das ist mehrdeutig und daher ein Kompilierungsfehler.


7
2018-02-23 22:41



Zuerst, anstelle von Ihrem reserve/ loop dingy, kannst du einfach benutzen resize um zu erreichen, was dein imaginierter Konstruktor tun würde:

const int n = 10;
std::vector<Foo, Alloc> foos(allocator);
foo.resize(n);

Eine andere Option ist die Verwendung der dreiargumentalen Version von size_type n Konstrukteur:

const int n = 10;
std::vector<Foo, Alloc> foos(n, Foo(), allocator);

Obwohl das tatsächlich Kopieren Konstruiert in die Elemente, die akzeptabel sein können oder nicht.

Auf der Grundlage? Keine Ahnung. Wahrscheinlich übersehen.


7
2018-02-23 22:34