vector.erase()
-
Hoi
vector<char>FileSizeVector; FileSizeVector.push_back('A'); FileSizeVector.push_back('B'); FileSizeVector.push_back('C'); cout<<"size: " <<FileSizeVector.size()<<endl; FileSizeVector.erase(FileSizeVector.begin()+2); cout<<"size: " <<FileSizeVector.size()<<endl; cout<<&FileSizeVector[0]<<endl;Wieso bekomme ich hier imm nur ABC ausgeben eigentlich müsste doch das letzte Element gelöscht werden oder nicht?
Also ich dachte ich könnte mit erase sowas machen:
vector<char>FileSizeVector; FileSizeVector.push_back('A'); FileSizeVector.push_back('B'); FileSizeVector.push_back('C'); FileSizeVector[FileSizeVector.size()-1]='\x00'; cout<<&FileSizeVector[0]<<endl;Setzte ich erase falsch ein oder hab ich da was falsch verstanden?
-
Wenn du mich fragst, setzt du erase richtig ein. Aber cout falsch.
cout<<&FileSizeVector[0]<<endl;Was glaubst du denn was das macht?
-
Mir den kompletten Vector ausgeben.
-
Datenlöscher schrieb:
vector<char>FileSizeVector; FileSizeVector.push_back('A'); FileSizeVector.push_back('B'); FileSizeVector.push_back('C'); cout<<"size: " <<FileSizeVector.size()<<endl; FileSizeVector.erase(FileSizeVector.begin()+2); cout<<"size: " <<FileSizeVector.size()<<endl; cout<<&FileSizeVector[0]<<endl;Du hast nach dem Einfügen in den vector 3 Daten hintereinander im Speicher stehen. A|B|C. Dann löschst du den letzen Eintrag im vector. Dabei wird auch der reservierte Speicherplatz für das Datum (C) freigegeben. Damit hat dein vector noch zwei Elemente. Das heißt aber nicht, dass sich im Speicherbereich etwas getan haben muss. Da kann sehr wohl immernoch A|B|C stehen, nur dass deinem Programm das C nicht mehr gehört. Da du dem Ausgabeoperator ein Zeiger auf einen char lieferst, wird einfach solange etwas ausgegeben, bis man auf das Terminierungszeichen '\0' stößt. Dieses Zeichen befindet sich wohl nach dem C, darum wird ABC ausgegeben.
Insgesamt hast du damit 2 Fehler gemacht:
1. Du greifst mit der Ausgabe auf einen Speicherbereich zu, der dir nicht gehört. Das mag wohl immer gut gehen,da du nur lesend und nicht schreibend zugreifst.
2. Du hantierst mit Zeichenketten und benutzt vector<char>. Für solche Dinge wurde bereits std::string erfunden.
-
Die Antwort hab ich erwartet.

vector<char>FileSizeVector; FileSizeVector.push_back('A'); FileSizeVector.push_back('B'); FileSizeVector.push_back('C'); cout<<"size: " <<FileSizeVector.size()<<endl; FileSizeVector.erase(FileSizeVector.begin()+2); FileSizeVector.push_back('\0'); //tu das hier mal in deinen code rein, schaue und staune cout<<"size: " <<FileSizeVector.size()<<endl; cout<<&FileSizeVector[0]<<endl;
-
KMT schrieb:
Die Antwort hab ich erwartet.

vector<char>FileSizeVector; FileSizeVector.push_back('A'); FileSizeVector.push_back('B'); FileSizeVector.push_back('C'); cout<<"size: " <<FileSizeVector.size()<<endl; FileSizeVector.erase(FileSizeVector.begin()+2); FileSizeVector.push_back('\0'); //tu das hier mal in deinen code rein, schaue und staune cout<<"size: " <<FileSizeVector.size()<<endl; cout<<&FileSizeVector[0]<<endl;Was gibt es da zu staunen, verstehe ich nicht

-
Aso, du meinst Ihn, nicht mich.

-
War nicht and dich gerichtet - ging darum das dann eben nur AB ausgegeben wird, da er früher eine 0-Terminierung findet.
-
Du gibst einen char* aus, nicht "den ganzen Vector". Und das Ende der Ausgabe hängt damit nur davon ab, wo im Speicher eine Nullterminierung steht.
-
Datenlöscher schrieb:
Mir den kompletten Vector ausgeben.
Genau hier ist der Denkfehler: Du gibst nicht "den kompletten Vector" aus, sondern alle Zeichen, die zwischen dem ersten Element des Vector und dem ersten Nullbyte, das darauf folgt, liegen. Beim Löschen eines Elements wird dieses ja aber nicht durch 0 ersetzt (warum auch).
-
Stimmt, das erinnert mich an meine experimente mit new delete und einem Debugger.^^
Danke