Element eines vectors löschen



  • Hallo zusammen,

    Ich hab folgendes Problem:

    Ein Vektor, der Instanzen einer Klasse als Elemente hat. Ich möchte einen Vektor an einer x-Beliebigen stelle löschen.
    Den Index des zu löschenden Elementes hab ich mit einer "while"-Schleife ermittelt.

    Folgendes hab ich inzwischen herausgefunden:
    1. Vektorelemente können mit: erase(iterator position); gelöscht werden.

    2. man muss einen Iterator als Argument übergeben.

    Meine Frage: Wie lege ich einen Iterator für mein Problem an?

    Vielen Dank im voraus

    gruß Arno

    Habe ich jetzt hinbekommen:

    vector<MyClass>::iterator pos;
    


  • Hallo

    Den Index des zu löschenden Elementes hab ich mit einer "while"-Schleife ermittelt.

    Wenn du einen Index hast, kannst du den dazugehörigen Iterator so bestimmen

    vector<MyClass>::iterator pos;
    std::advance(pos, index);
    myvector.erase(pos);
    

    Allerdings wäre es in diesme Fall besser, bei der Bestimmung des zu löschenden Elements gleich mit einem Iterator anstatt des Interger-Indexes zu arbeiten.

    bis bald
    akari



  • Vielen Dank für den Tip.

    Hab jetzt sämtliche Varianten durch, aber das Vektorelement wird nicht gelöscht.
    Kann das am Destruktor liegen?



  • vector<MyClass>::iterator pos = myvector.begin();
    


  • Hab ich auch schon ohne Erfolg versucht.



  • Da ist dann doch aber etwas grundsätzlich murks, was ohne Code nicht gelöst werden kann



  • Hab den Fehler gefunden.

    Und zwar rufe ich .erase(pos) in der while-Schleife auf. Die Bedingung lautet "i < Flugzeug.size()", was natürlich nicht funktionieren kann, weil sich die grösse und die Anordnung der Elemente im Vektor ändert.

    Sorry hab meine Ausgabe nicht genau angeschaut, sonst wäre mir das schon früher aufgefallen.



  • Jetzt hab ich natürlich das nächste Problem.

    Ist es möglich mittels eines Iterators und meinen Elementfunktionen auf den Vektor zuzugreifen? Wenn ja, wie?



  • Hallo

    natürlich geht das.

    vector<MyClass>::iterator it = ...;
    it->MyMethode();
    

    bis bald
    akari



  • Vielen Dank.

    So viel zu lernen und nur so wenig Zeit, schade eigentlich.

    Gruß Arno



  • Dieser Thread wurde von Moderator/in Jansen aus dem Forum VCL/CLX (Borland C++ Builder) in das Forum C++ verschoben.

    Im Zweifelsfall bitte auch folgende Hinweise beachten:
    C/C++ Forum :: FAQ - Sonstiges :: Wohin mit meiner Frage?

    Dieses Posting wurde automatisch erzeugt.



  • Ich häng mich hier mal ran.
    Warum geht folgendes vor den Baum:

    for (MyMap::iterator it = myMap.begin(); it!=myMap.end(); it++)
    {
       if (condition xyz...)
          myMap.erase(it);	
    }
    

    Es sieht so aus, als ob der Iteratorwert it bei erase() ungültig wird und deshalb im nächsten Schleifendurchlauf nicht inkrementiert werden kann.

    Frage also:
    Wie bekomme ich einzelne Elemente in einem Durchgang aus dem Vektor bzw. Map herausgelöscht?

    Gruß, Thomas



  • Das sieht nicht nur so aus, das ist auch so. Aber normalerweise gibt erase() einen Iterator auf das Element hinter der "Lücke" zurück, den du entgegennehmen und verwenden kannst.



  • Ja, aber auch

    for (MyMap::iterator it = myMap.begin(); it!=myMap.end(); it++)
    {
       if (condition xyz...)
          it = myMap.erase(it);   
    }
    

    produziert den selben Fehler zur Laufzeit. 😕



  • Thomsn schrieb:

    produziert den selben Fehler zur Laufzeit. 😕

    Ist vermutlich nicht derselbe - auch wenn er sich genauso äußert 😃

    Wenn Du das letzte Element löscht gibt erase Dir den Ende-Iterator zurück. Der wird dann aufgrund der For-Schleife erneut inkrementiert. Egal wo der dann ist, er ist auf keinen Fall mehr == myMap.end(). Dadurch gelangt er ein weiteres mal in den Schleifenkörper und dann knallts gewaltig.

    Versuche:

    for (MyMap::iterator it = myMap.begin(); it!=myMap.end();)
    {
       if (condition xyz...)
          it = myMap.erase(it);
       else
          ++it;
    }
    


  • LordJaxom schrieb:

    Wenn Du das letzte Element löscht gibt erase Dir den Ende-Iterator zurück. Der wird dann aufgrund der For-Schleife erneut inkrementiert.

    Wäre die Rückgabe myMap.end() würde die Schleife doch ganz normal abbrechen.



  • Theoretisch ja - aber der Iterator wird am Schleifenende nochmal erhöht, BEVOR die Abbruchbedingung überprüft wird. Und was herauskommt, wenn du den end()-Iterator erhöhst, ist undefiniert (und häufig unangenehm).



  • Klar, jetzt verstehe ich. Nach dem selben Prinzip läuft auch

    for (int i=0; i!=3; i++)
    {
    	i = 3;
    }
    

    ins Endlose.

    Danke euch!



  • Das hier geht auch

    for (MyMap::iterator it = myMap.begin(); it!=myMap.end();)
    {
       if (condition xyz...)
          myMap.erase(it++);
       else
          ++it;
    }
    

Anmelden zum Antworten