Gewährleistet vectorlistT, dass die Elementadressen unverändert bleiben?

9

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

%Vor%

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.

    
jick 31.08.2014, 20:59
quelle

2 Antworten

4

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.

    
Eric Niebler 01.09.2014, 05:15
quelle
1

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.

    
Michael Aaron Safyan 31.08.2014 21:04
quelle

Tags und Links