12 Stimmen

std::vector fügt eine Kopie oder einen Verweis auf ein Objekt ein?

Nehmen wir an, ich habe ein Objekt, das ich dynamisch zugewiesen habe. Wenn ich es in einen STL-Vektor schiebe, wird dann eine Referenz in den Vektor eingefügt oder eine Kopie dieses Objekts?

Es ist eine allgemeine Frage. Zum Beispiel:

class vec {
vector<obj> vec;
void addToVec(obj a) {
    // insert a into vec
 }
  ...
  ...
  ...
 }

obj* a = new obj;
 vec* v = new vec;
 vec.addToVec(a); 

Wenn ich v lösche, wird dann auch das Objekt a sterben?

9voto

iammilind Punkte 64857

wird ein Verweis in den Vektor oder eine Kopie dieses Objekts eingefügt?

Kopieren (was bedeutet, dass Ihr class sollte kopierbar sein, sonst Compilerfehler).

Klärung : Referenzen können nicht zugewiesen werden in std::vector<> . Außerdem hat Objekt hier eine breitere Bedeutung, es kann eine normale Variable oder ein Zeiger sein, aber std::vector<> nimmt nur Kopien an.

Update : Nach C++11 bieten die meisten der Standard-Container std::move() des Objekts unter Verwendung von "rwertbasierten API-Methoden", wobei eine Kopie nicht durchgeführt werden darf.

9voto

D.Shawley Punkte 56313

Wenn Sie ein Objekt vom Typ T die Sie dynamisch zugewiesen haben, und Sie schieben eine Zeiger auf das Objekt auf eine std::vector<T*> , dann a Kopie des Zeigers geschoben wird. Wenn Sie den Zeiger dereferenzieren und das Ergebnis auf einen std::vector<T> dann wird eine Kopie des Objekts erstellt. Sammlungen erstellen immer Kopien. So machen Sammlungen von Zeigern Kopien des Zeigers und Sammlungen von Klasseninstanzen machen Kopien der Instanzen selbst (unter Verwendung der Kopierkonstruktion IIRC).

3voto

Alok Save Punkte 196241

Haben Sie die Referenz :

void push_back ( const T& x );

Element am Ende hinzufügen

Fügt ein neues Element am Ende des Vektors, nach dem letzten Element, ein. Der Inhalt dieses neuen Elements wird mit einer Kopie von x initialisiert.

Dadurch wird die Vektorgröße effektiv um eins erhöht, was eine Neuzuweisung des intern zugewiesenen Speichers bewirkt, wenn die Vektorgröße vor dem Aufruf gleich der Vektorkapazität war. Neuzuweisungen machen alle zuvor erhaltenen Iteratoren, Referenzen und Zeiger ungültig

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X