A std::vector
ist nicht eine feste Größe, so dass, wenn es keine Elemente drin sind, werden size
zurückkehren 0
und leer wird true
zurück.
std::vector<int> v;
auto sz = v.size(); // sz has value 0
auto e = v.empty(); // true
v.push_back(42);
sz = v.size(); // 1
e = v.emi empty(); // false
Sie können auch Elemente entfernen (der Vektor alle followingv Elemente bewegt sich die Lücke zu füllen unten)
std::vector<int> v { 1, 2, 3 };
auto it = v.find(2);
if (it != v.end())
v.erase(it); // v now contains 1, 3
Also in der Theorie, nicht Sie nicht brauchen nullptr
s setzen in Ihrem Vektor. Dies setzt voraus, dass Sie Ihre Anwendung so entworfen haben, dass in Ihrem Vektor keine bestimmte Populationsgröße erforderlich ist. Wenn dies der Fall ist, ist Vektor möglicherweise nicht der richtige Container. Betrachte std :: array.
Es gibt jedoch ein Problem mit Ihrem Renderable-Vektor: Der Vektor speichert Instanzen von Renderable
. Die Elemente, die ich bin der Vektor sind genau die Größe eines Renderable. Wenn Sie also versuchen, eine abgeleitete Klasse zu speichern, z. B. Mesh
, verlieren Sie die zusätzlichen Felder für abgeleitete Klassen.
Dies wird als Slicing bezeichnet.https://en.m.wikipedia.org/wiki/Object_slicing
Sie müssen Zeiger oder Verweise auf die Instanzen der Objekte speichern. Das hängt von der Lebensdauer und dem Besitz der Instanzen ab.
Wenn Ihr Vektor die Behebbaren besitzt, können Sie std::vector<std::unique_pre<Remediable>>
verwenden.
Wenn Sie die Instanzen von Ihrem Anrufer erhalten, vielleicht std::shared_ptr
.
Wenn Sie keine Unterstrukturen haben, fügen Sie * nichts * in den Vektor ein. – Galik
Wenn Sie fragen müssen, ob ein Nullzeiger in Ihrem Graphen angebracht ist, haben Sie eine schlechte Zeit. –