Element in einem Vector löschen



  • Hallo,

    wie kann man ein Element in einem Vector löschen,

    also der user wird aufgefordert eine zahl einzugeben(via cin) dann wird nach der zahl in einem vorgebene vector gesucht und dann soll diese element an dieser stelle entfernt werden, nun wollte ich wissen wie das geht??also ich hab schon ma die suche genutzt,aber sorichtig nix gefunden.



  • Ja, kannst du - Zahl suchen mit find() und anschließend löschen per erase().

    (alterativ kannst du mit remove() auch alle Vorkommen der Zahl löschen und anschließend die Größe korrigieren)



  • jo ok...aber ich kann genauso die zahl in einer schleife suchen oder?? also eine schleife über den ganzen vector und dann wenn gefunden wurde die shcleife abbrechen,
    kannst du eventuell mal ein besipeil für find(),erase(),und remove() zeigen???



  • Erster Ansatz (findet und löscht erstes Vorkommen des Wertes):

    vector<int>::iterator pos=find(data.begin(),data.end(),zielwert);
    data.erase(pos);
    

    Zweiter Ansatz (löscht alle Vorkommen des Wertes):

    vector<int>::iterator pos=remove(data.begin(),data.end(),zielwert);
    //remove kann keine Elemente physisch löschen, deswegen schiebt es die
    //Überlebenden nur zusammen und liefert einen Iterator auf das erste ungültige Element
    data.erase(pos,data.end());
    


  • puhh ich glaube ich sollte mir ma angucken was iteratoren sind...aber so es einfach so heir machen kann ich net

    cin>>zahl;
    vector<int> liste;
    
    for(size_z i=0;i<liste.size();++i)
    {
       if(zahl==liste[i])
       {
          erase(zahl)
       }
    }
    

    also so einfach geht es net oder???



  • Firefighter schrieb:

    puhh ich glaube ich sollte mir ma angucken was iteratoren sind...aber so es einfach so heir machen kann ich net

    In Kurzfassung: zeigerähnliche Objekte, die sich mit der Struktur des unterliegenden Containers auskennen. Genaueres findest du z.B. in meinen Magazin-Artikeln (Aufbau der STL).

    also so einfach geht es net oder???

    Nein - erase() erwartet einen Iterator, der auf das zu löschende Element verweist.



  • könntest du das beispiel nochmal so gestalten das der user voher eine zahl eingeben muss und diese dann mit in dieser sache von erase verwaltet wird?? weil mir fällt das ein bissel schwer durch die sache mit den iteratoren durchzublicken



  • vector<int> Liste;
    
    Liste.Add(1);
    Liste.Add(2);
    Liste.Add(3);
    Liste.Add(4);
    Liste.Add(5);
    
    int iZahlDieGelöschtWerdenSoll = 3;
    
    // Zahl 3 aus vector löschen!
    vector<int>::iterator pos=find(Liste.begin(),Liste.end(),iZahlDieGelöschtWerdenSoll); 
    Liste.erase(pos);
    


  • Firefighter schrieb:

    könntest du das beispiel nochmal so gestalten das der user voher eine zahl eingeben muss und diese dann mit in dieser sache von erase verwaltet wird?? weil mir fällt das ein bissel schwer durch die sache mit den iteratoren durchzublicken

    Sorry, wenn meine Beispiele ein wenig minimalistisch ausfallen, aber ganz wollte ich dir das Denken nicht abnehmen (und ich hatte gehofft, die Variablennamen wären aussagekräftig genug, um zu erkennen, daß z.B. 'zielwert' der Wert ist, den du suchen und löschen möchtest)



  • ok jetzt ist es klar...aber ma noch ne frage muss ich da nen ebstimmten header mit einbinden??



  • algorithm.h



  • BorisDieKlinge schrieb:

    algorithm.h

    Fast richtig - der heißt <algorithm> (C++ Standardheader haben keine Dateiendung)



  • jop ok super danke... und wie könnte ich es machen das ich den ganzen vektor lösche, soll ich da einfach ne schleife machen wo jedes einzelne element mit dem iterator zeug gelöscht wird ...oder geht es einfacher??



  • Du willst alle Elemente des vector's löschen (also einen komplett leeren vector)? Wenn ja, der schnellste Weg ist vec.clear(); (dicht gefolgt von vec.erase(vec.begin(),vec.end()); ).



  • also wenn mein vector Liste heißt, kann ich einfach ohne irgendwelches vorgeplänkel hinschreiben

    Liste.clear();

    und der vector ist gelöscht?? also geleert??



  • Firefighter schrieb:

    und der vector ist gelöscht?? also geleert??

    Gelöscht (==weg/zerstört/vernichtet) nicht - das passiert erst, wenn du den Scope verlässt, in dem er angelegt wurde. Geleert (==nichts mehr drin) ja.

    (sorry für die Spitzfindigkeiten ;))


Anmelden zum Antworten