Vector Element wird nicht gelöscht

cesupa

Erfahrenes Mitglied
Hallo,

cih versuche grad mein Wissen in Sachen Vektoren zu vergrößern und konnte schon meine ersten Erfolge erzielen^^ Nur leider steck ich grad beim löschen eines Elements fest:

Code:
#include <cstdlib>
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

struct test{
       int s1;
       char buf[256];
       };

int main(int argc, char *argv[])
{
    test t1;
    vector<test> vt,vt2;
    
    t1.s1=23;
    strcpy(t1.buf,"TEST");
    vt.push_back(t1);
    
    t1.s1=5;
    strcpy(t1.buf,"TEST_2");
    vt.push_back(t1);
    
    cout<<vt[0].buf<<endl;       //TEST
    cout<<vt[1].buf<<endl;       //TEST_2
    
    ofstream os;
    os.open("TEST1.txt",ios::binary);
    os.write((char*)&vt,sizeof(vt));
    os.close();
    
    ifstream is;
    int len=0;
    char* buf;
    is.open("TEST1.txt",ios::binary);
    is.seekg(0L,ios::end);
    len=is.tellg();
    is.seekg(0L,ios::beg);
    buf=new char[len];
    
    is.read(buf,len);
    vt2=*(vector<test>*)buf;
    
    delete[] buf;
    is.close();
    
    cout<<vt2[1].buf<<endl;               //TEST_2
    
    vt2.erase(vt2.begin());

    cout<<"GELOESCHT(0): "<<vt2[0].buf<<endl;        //TEST_2
    cout<<"GELOESCHT(1): "<<vt2[1].buf<<endl;       //TEST_2
    system("PAUSE");
    return EXIT_SUCCESS;
}

Warum löscht er nicht das erste Element aus meinem Vektor?

Gruß
cesupa
 
Hi.
Hallo,

cih versuche grad mein Wissen in Sachen Vektoren zu vergrößern und konnte schon meine ersten Erfolge erzielen^^ Nur leider steck ich grad beim löschen eines Elements fest:

Code:
#include <cstdlib>
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;

struct test{
       int s1;
       char buf[256];
       };

int main(int argc, char *argv[])
{
    test t1;
    vector<test> vt,vt2;
    
    t1.s1=23;
    strcpy(t1.buf,"TEST");
    vt.push_back(t1);
    
    t1.s1=5;
    strcpy(t1.buf,"TEST_2");
    vt.push_back(t1);
    
    cout<<vt[0].buf<<endl;       //TEST
    cout<<vt[1].buf<<endl;       //TEST_2
    
    ofstream os;
    os.open("TEST1.txt",ios::binary);
    os.write((char*)&vt,sizeof(vt));
So kannst du ein Objekt wie einen std::vector nicht einfach speichern. Damit speicherst du nur den internen Zustand des Objekts aber nicht die Daten die das Objekt verwaltet. Es funktioniert hier lediglich weil das Schreiben und Lesen innerhalb des gleichen Programms passiert und v1 auch weiterhin ein gültiges Objekt ist. Wenn du das Objekt persistent in einer Datei speichern willst mußt du die Daten die das Objekt verwaltet speichern.
Code:
    os.close();
    
    ifstream is;
    int len=0;
    char* buf;
    is.open("TEST1.txt",ios::binary);
    is.seekg(0L,ios::end);
    len=is.tellg();
    is.seekg(0L,ios::beg);
    buf=new char[len];
    
    is.read(buf,len);
    vt2=*(vector<test>*)buf;
    
    delete[] buf;
    is.close();
    
    cout<<vt2[1].buf<<endl;               //TEST_2
    
    vt2.erase(vt2.begin());

    cout<<"GELOESCHT(0): "<<vt2[0].buf<<endl;        //TEST_2
    cout<<"GELOESCHT(1): "<<vt2[1].buf<<endl;       //TEST_2
Wie kommst du darauf das das Objekt nicht aus dem Vektor entfernt wurde? Was ist denn die Größe des Vektors (v2.size())?

Gruß
 
Hallo,
also die Größe verändert sich von zwei auf eins, heißt also er löscht das Element, aber warum sehe ich dann jeweils TEST_2 erscheinen?
Wie kann ich einen Vektor speichern?

Gruß
cesupa
 
Hi.
Hallo,
also die Größe verändert sich von zwei auf eins, heißt also er löscht das Element, aber warum sehe ich dann jeweils TEST_2 erscheinen?
Der Vektor besitzt eine bestimmte Kapazität von Elementen die er speichern kann. Es wird nicht für jedes Element einzeln Speicher angefordert und es wird auch kein Speicher freigegeben wenn ein einzelnes Element gelöscht wird.

Beim Löschen eines Elementes mit Index i werden alle Elemente von Index i+1 bis zum letzten Element des Vektors um eine Position nach links kopiert (das ist auch der Nachteil eines Vektors und wenn man häufig löschen muß sollte man lieber eine Liste nehmen). Die Größe des Vektors wird um eins dekrementiert, die Kapazität ändert sich nicht.

Wenn du in deinem Beispielprogramm auf v2[1] zugreifst, greifst du auf ein nicht existierendes Vektorelement zu. Dabei wird vom Vektor nicht geprüft ob der Index überhaupt gültig ist. Verwende die at Methode für einen validierenden Zugriff:
C++:
v2.at(2);
Dann bekommst du eine Ausnahme wenn du der Index nicht gültig ist.

Wie kann ich einen Vektor speichern?
Indem du die Daten des Vektors speicherst und dann wieder einliest. Das Format der Datei kannst du dir selbst ausdenken. Am besten du gibst gleich am Anfang an wieviel Elemente im Vektor sind, so kannst du beim Auslesen gleich die Kapazität (mit reserve) setzen.

Gruß
 
Zurück