vector statt array



  • Danke,
    ja sowas hab ich gesucht, danke es funktioniert.

    Jetzt hab ich nur noch ein Problem,

    vector<vector<mytest> > test2(10);
    mytest demo;
    test[0].push_back(demo);

    funktioniert wie oben, auch das auslesen
    test[0][0] ... test[9][x]

    aber wenn ich z.B.
    test[2].clear() oder test[2].erase()
    benutze, ist der Wert später immer noch drin.

    benutze ich test.clear() ist alles gelöscht.
    Überprüfe ich danach die Größe mit .size()
    ergibt sich bei
    test.size() = 0
    bei
    test[2].size() = immernoch die alte Größe z.B. 2



  • Um einzelne Elemente aus dem Hauptvector zu löschen, solltest du dir mal erase() ansehen.

    btw:

    Nussknacker schrieb:

    benutze ich test.clear() ist alles gelöscht.
    Überprüfe ich danach die Größe mit .size()
    ergibt sich bei
    test.size() = 0
    bei
    test[2].size() = immernoch die alte Größe z.B. 2

    Das fällt wohl unter "undefined behaviour" - du greifst auf Elemente zu, die nicht (mehr) dem vector gehören.


  • Mod

    Nussknacker schrieb:

    benutze ich test.clear() ist alles gelöscht.
    Überprüfe ich danach die Größe mit .size()
    ergibt sich bei
    test.size() = 0
    bei
    test[2].size() = immernoch die alte Größe z.B. 2

    Leichenfledderei.



  • Hab nochmal getestet,

    test[1].erase(test[1].begin()+1); funktioniert

    hatte es vorher so:
    test2[1].erase(test2.begin()+1);

    nur test2[1].clear() funktioniert nicht, aber dafür kann ich ja erase() benutzen.

    Nochmal danke für eure Hilfe.



  • Nussknacker schrieb:

    nur test2[1].clear() funktioniert nicht, aber dafür kann ich ja erase() benutzen.

    Nicht? was liefert denn danach ein test2[1].size() ? Wenns 0 ist, hats funktioniert. Dass du evtl. mit test2[1][4] dann noch Werte bekommst ist dann Pech (weils so aussieht als ob es nicht geklappt haette) oder Glueck (dass dir das programm nicht gleich um die Ohren fliegt), denn der operator[] prueft die indexgrenzen nicht, man kann also durchaus Indizes angeben, die nicht im vector sind (hier die 4). Was dabei rauskommt ist allerdings undefiniert.



  • Meine Testläufe haben bei mir folgendes ergeben,

    Größen vor clear()
    test.size() = 10
    test[0].size() = 2
    test[1].size() = 3
    test[2].size() = 4

    benutze ich test.clear()
    dann sind die Größen:
    test.size() = 0
    test[0].size() = 2
    test[1].size() = 3
    test[2].size() = 4

    benutze ich test[1].clear()
    dann sind die Größen:
    test.size() = 10
    test[0].size() = 0
    test[1].size() = 0
    test[2].size() = 0

    Ich benutze den MinGW Compiler, evtl. ist es bei anderen Compilern anders.
    Am besten ich benutze nur erase()
    oder wenn ich alles löschen will eine Schleife welche zuerst test[0] - test[n] löscht
    und danach test.clear() dann müsste alles auf NULL sein.



  • Das zweite ist auf jeden Fall undefined - aka "Leichenfledderei", warum der Aufruf test[1].clear(); alle Elemente von test löschen sollte, ist mir ein Rätsel.



  • Hab das Testprogramm nochmal neu geschrieben, nun funktioniert es.
    Nur vector<vector<>> drin.

    Ich hatte noch die alte Array Version im Programm und die vector<vector<>>
    hinten angehängt, hab aber den Namen test2 genannt, von einem struct müsste man
    doch mehrere Varianten ableiten können ?
    Ich habe schon test2 für meine clear() Versuche verwendet und nicht test

    Hier alte Array Version mit drin, so:

    struct mytest {
        int irgendwas;
        int sonstwas;
    } 
    
    vector <mytest> test[ 10 ];
    mytest demo;
    
    vector<vector<mytest> > test2(10);
    

    Aufgefüllt hab ich zuerst die Array Version mit demo und danach die vector<vector<>> Version, auch mit demo, aber demo ist ja nicht mit test oder test2 gekoppelt, oder versteh ich da was falsch ?



  • CStoll schrieb:

    warum der Aufruf test[1].clear(); alle Elemente von test löschen sollte, ist mir ein Rätsel.

    Tut er nicht. Wenn der vector mit vector<vector<X> > test(10); erstellt wurde, reserviert das dem aeusseren vector speuicher fuer 10 innere vectoren - die werden mit default-ctor initialisiert, also test[i].size() == 0 fuer i = 0..9.
    Selbst wenn er wie oben geschrieben einmal test[0].push_back(demo); aufgerufen hat, bleiben die anderen inneren vectoren ja verschont.



  • Hat sich aufgeklärt, ich hatte einen schreibfehler drin.
    Sorry.
    Es funktioniert nun alles wie es soll.


Anmelden zum Antworten