T
DaPeter schrieb:
Nabend,
std::vector<T> big_vector(n)
Kann ich hier irgendwie vermeiden, dass sämtliche n Einträge initialisiert werden?
Vielleicht mit einem custom allocator, der nur alloziert? (damit kenne ich mich nicht aus).
Ich kann natürlich einfach ein normales mit new erzeugtes array wrappen, aber ich will den Code nicht unnötig aufblähen.
Du musst die Initialisierung halt inline und schnell machen. Anders geht es nicht.
Wenn Du einen std::vector mit n Elementen hast, dann hast Du die Garantie, dass die Elemente auch funktionieren. Und das kann nur ein Konstruktor leisten.
Denke mal daran, dass T ja auch ein Objekt sein kann, der im Destruktor etwas mit seinen Elementen macht. Ist da ein Zeiger dabei, der nicht initialisiert ist, dann gibt es Probleme.
Du kannst übrigens auch dem Konstruktor von std::vector einen 2. Parameter mit geben, der zum initialisieren verwendet wird. Beispielsweise:
std::vector<MyClass> big_vector(4711, MyClass::null())
Dann wird nicht der Default-Konstruktor aufgerufen sondern der copy-Konstruktor. Das könnte unter Umständen billiger sein.
Eine andere Möglichkeit ist, wie bereits erwähnt mit reserve Speicher bereits zu reservieren. Dann kannst Du aber nicht einfach auf die Elemente zugreifen. Aber Du kannst sie durch push_back (oder emplace_back) bei Bedarf erzeugen, ohne dass eine Allokation des Vectors statt findet.