vector.erase macht merkwürdigen unsinn....



  • vc.erase(vc.begin()+2);
    

    ich damit jetzt mal weiter probiert... wenn ich das anwende wird element nr. 3 gelöscht (von 1 angefangen zu zählen), ABER der vector ist jetzt nicht um eins kleiner sondern an den letzten platz wurde stattdessen der selbe inhalt geschrieben wie im vorletzten.

    bsp.:

    vc[0] = 0
    vc[1] = 1
    vc[2] = 2
    vc[3] = 4
    vc[4] = 5
    vc[5] = 6
    vc[6] = 7
    vc[7] = 8
    vc[8] = 9
    vc[9] = 9  //hier
    

    bei schleifen die das wiederholen kommt datenmüll am schluss wobei die länge der hinteren plätze variert...

    ich kann damit nichts anfangen, ich möchte nur einen bereich gelöscht haben.

    mus wohl eine eigene funktion schreiben. :xmas2: :xmas2: :xmas2:
    :xmas1:



  • ich vermute mal, dass kein .resize() gemacht wurde, der op[] also in ins leere schießt und erase blödsinn macht, weil man was löschen will, was nicht existiert

    nein, wie macht man das 😕



  • Das liegt daran, dass der entsprechend umzukopierende Bereich umkopiert wird,
    der alte Inhalt aber natuerlich unangetastet bleibt.

    Shade hat es ja schon angedeutet, mach mal ein 'resize()' nach der Loesch-Operation

    Ist allerdings ein merkwuerdiges Verhalten, IMHO. Bei mir aendert sich die Groesse.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Das liegt daran, dass der entsprechend umzukopierende Bereich umkopiert wird,
    der alte Inhalt aber natuerlich unangetastet bleibt.

    Shade hat es ja schon angedeutet, mach mal ein 'resize()' nach der Loesch-Operation

    Ist allerdings ein merkwuerdiges Verhalten, IMHO. Bei mir aendert sich die Groesse.

    Hast du mehr Daten als hier im Thread gesagt wurden?

    Naja, jedenfalls habe ich folgendes gemeint:

    vector<int> vc;
    vc[0] = 1;
    vc[1] = 2;
    vc[2] = 3;
    vc[3] = 4;
    vc[4] = 5;
    vc[5] = 6;
    vc[6] = 7;
    vc[7] = 8;
    vc[8] = 9;
    vc[9] = 0;
    

    was natürlich ein Fehler ist, da vc nicht dynamisch mit dem op[] wächst.
    Das erase() ansich ist richtig, nur tippe ich, dass vc garkeine Elemente hat (sofern meine Annahme über die Füllung des vectors zutrifft)

    Am besten wäre es aber, wenn der OP einen Beispielcode posten würde, der den Fehler zeigt.



  • Der vector wächst nicht mit op[]??? 😕



  • ness schrieb:

    Der vector wächst nicht mit op[]??? 😕

    Nein. Laut Definition liefert er nur einen Wert zurück, mehr nicht.

    reference operator[](size_t n) { return *(begin() + n); }
    


  • Shade Of Mine schrieb:

    virtuell Realisticer schrieb:

    Das liegt daran, dass der entsprechend umzukopierende Bereich umkopiert wird,
    der alte Inhalt aber natuerlich unangetastet bleibt.

    Shade hat es ja schon angedeutet, mach mal ein 'resize()' nach der Loesch-Operation

    Ist allerdings ein merkwuerdiges Verhalten, IMHO. Bei mir aendert sich die Groesse.

    Hast du mehr Daten als hier im Thread gesagt wurden?

    Ich habe lediglich einen vector befuellt, Elemente herausgeloescht und mir
    die entsprechende Groesse ausgeben lassen.

    Naja, jedenfalls habe ich folgendes gemeint:

    vector<int> vc;
    vc[0] = 1;
    vc[1] = 2;
    vc[2] = 3;
    vc[3] = 4;
    vc[4] = 5;
    vc[5] = 6;
    vc[6] = 7;
    vc[7] = 8;
    vc[8] = 9;
    vc[9] = 0;
    

    was natürlich ein Fehler ist, da vc nicht dynamisch mit dem op[] wächst.
    Das erase() ansich ist richtig, nur tippe ich, dass vc garkeine Elemente hat (sofern meine Annahme über die Füllung des vectors zutrifft)

    Am besten wäre es aber, wenn der OP einen Beispielcode posten würde, der den Fehler zeigt.

    Ich bin gar nicht davon ausgegangen, dass der OP auf diese Art und Weise
    versucht hat den vector zu fuellen. Dachte er will damit nur zeigen, welche
    Werte sich an welchem Index befinden.

    mfg
    v R



  • virtuell Realisticer schrieb:

    Ich bin gar nicht davon ausgegangen, dass der OP auf diese Art und Weise
    versucht hat den vector zu fuellen. Dachte er will damit nur zeigen, welche
    Werte sich an welchem Index befinden.

    Möglich, deshalb habe ich auch "ich tippe" geschrieben 😉

    denn dies ist ein häufiger Fehler. Aber wie gesagt: ohne mehr code, können wir nur raten 😞



  • ich wollte wirklich nur zeigen welche werte sich anschließend im index befinden.
    in der stl steht doch das der bereich gelöscht wird ich versteh deshalb nicht warum sich nun mein arry mit irgendwelchen datenmüll füllt... .

    ursprünglich hatte ich vor mit einer funktion positionen zu ermitteln diese dann zu benutzen um einen bereich zu löschen und daten wieder an den vector zu zu packen. da mein vector nur aus ziffern besteht, fiel alsbald auf das beim rechnen mit den werten schrott rauskam... ich könnte zwar den code posten aber die funktionen sind recht verschachtelt... .

    :xmas2: :xmas1: :xmas2: :xmas1: :xmas2: :xmas1: :xmas2:



  • ich möchte das jemand vielleicht mal SEINE variante aufzeigt um bereiche in dynamischen arrays zu löschen. ohne das am ende z.b | oder " " angefügt werden UND das auch entsprechner bereich gelöscht wird. kann mein ehler am compiler liegen, nee oder... nutze den standart linux compiler gcc etc.



  • ragnröq schrieb:

    ich könnte zwar den code posten aber die funktionen sind recht verschachtelt...

    Mach ein minimal Beispiel.
    10 vielleicht 15 Zeilen müssten reichen.



  • //funktion rechnen ==>es muss ein vector übergeben werden
    
      for(int x = 0; x < vc.size(); x++) {
        if(vc[x] == '*') {
    
          temp_var = vorgzahl(vc, x) * gziffer(vc, x);
          vc.erase(vc.begin()+pos_vorgzahl, vc.begin()+pos_gziffer+2);
    
          vc.push_back('*');
    
          int z = zahl_char(temp_var, 50).size();
          int y = 0;
    
          while(y <= z) { 
            vc.push_back(zahl_char(temp_var, 50)[y]);
    	y++;
          }
    
        }
    }
    

    ein teil meiner funktion "rechnung", das nächst einfachere beispiel wäre eine simple schleife zur eingabe von char elementen und eine zur ausgabe.

    vorgzahl und gziffer bestimmen die vorhergehende zahl und nachfolgende (und wandeln eine reihe von char elementen bis zum !isdigit()-element um;) machen praktisch zahlen draus. außerdem weisen die sie den globalen variablen pos_vorgzahl , etc. die positionen zu vie später aus dem array gelöscht werden sollen.
    also ab vorgängerzahl bis nachfolgende zahl vom "*" aus gesehen.

    das produkt der beiden zahlen zoll dann am ende des vektord angehangen werden.

    vc.push_back(zahl_char(temp_var, 50)[y]);
    

    zahl_char() wandelt eine zahl wieder in eine zeichenkette um damit meine funktion damit rechnen kann.
    das geht logischerweise solange bis alles ausmultipliziert wird.
    das muss ich so machen weil ich später noch klammern und aditionen himzufügen will,

    problem ist bei erase zu suchen, die template(erase) spukt bei eingabe von "22*2*2" das aus:

    pos0 2
    pos1 *
    pos2 4
    pos3 4
    pos4 8
    pos5
    pos6 0
    pos7 2
    pos8
    

    das sind die inhalte des modifizierten vectors
    pos0 - bis pos3 sind okay aber späters ist müll.
    ACHTUNG: ich habe auch in erfahrung gebracht das bei anderen eingaben nicht nur letzte elemente "müll" sind.
    beispiels weise kann auch mitten in einem "richtigen" abschnitt ein freizeichen sein.

    die eingaben werden wie man sich denken kann zeichenweise eingelesen. ( bis zu einem festgelegten zeichen.

    ist eventuell etwas kompliziert aber ich kann gerne noch mehr posten oder eventuelle fragen beantworten. dies ist aber ein praxisnahes beispiel meines problems

    frohe fastheiligenachten lol



  • konnte ich mir denken... . aber meine frage wie man jenes verhindern kann bleißt in der luft hängen 🙄


Anmelden zum Antworten