Wir alle wissen, dass sich Adressen von Elementen in vector<T>
ändern können, wenn wir mehr Elemente anhängen (aufgrund der Größenanpassung), während Elemente in list<T>
an derselben Adresse bleiben.
Die Frage ist, was ist mit vector<list<T>>
? Zum Beispiel
Können wir annehmen, dass ptr
gültig bleibt?
Naiv, ich denke, das sollte es, denn wenn der Vektor seine Größe ändert, sollte er den Bewegungskonstruktor von list<T>
aufrufen, der einzelne Elemente nicht kopieren / verschieben soll. Ich weiß jedoch nicht, ob der Standard dies gewährleistet.
Sorry, nein. Der Bewegungskonstruktor von std::list
ist nicht noexcept
. std::vector
used std::move_if_noexcept
bei Größenanpassungen, die Kopien für das enthaltene std::list
s sind. Alle Listenknoten werden zugewiesen und kopiert. Ihre Adressen werden nicht stabil sein.
Sie sollten es wahrscheinlich zu einem vector<list<T>*>
und nicht zu einem vector<list<T>>
machen. Mit vector<list<T>*>
können Sie sicher sein, dass die enthaltenen Zeiger nicht geändert werden (und dass es kein schweres Kopieren der inneren Listen geben wird), da sie Werte des Vektors und der Werte des Vektors sind nicht von der Erweiterungslogik geändert. Dies ist viel sicherer, als sich auf das Kopieren der internen Listen zu verlassen, um nur das Kopfelement zu verschieben und keine der verbleibenden Knoten neu zuzuweisen (es ist auch verständlicher). Anderenfalls ist es schwer zu verstehen und spielt nur mit Feuer.