löschen aus z.B. vector per iterator beim durchlauf?



  • vector<int> vectorInt;
    vectorInt.push_back( 2 );
    
    for( vector<int>::iterator iter = vectorInt.begin(); iter != vectorInt.end(); iter ++ ){
    	if( (*iter)->foo() ){
    	    iter= vectorInt.erase( iter);
    	}
    }
    

    Das führt aber zu ganz häßlichen Problemen, wenn das letzte element entfernt wird - jemand einen Tip, wie man das "richtig" macht?



  • Hi,

    mir ist nicht klar wie ein int einen Member foo() haben kann.

    Naja egal, so könntest du das auch machen:

    vector<int> vectorInt;
    vectorInt.push_back( 2 );
    
    vector<int>::iterator iter;
    while((iter = vectorInt.begin()) != vectorInt.end())
    {
      vectorInt.erase(iter);
    }
    


  • eViLiSSiMo schrieb:

    Hi,
    mir ist nicht klar wie ein int einen Member foo() haben kann.

    hihi, das liegt wohl daran, dass ich den source "aufgräumt/vereinfacht" habe:)
    hmm, das mit ner while is ne idee:)



  • Das kannst du so NICHT machen.
    Weil der erase() die Iterator-Variable "iter" ungültig macht. Dadurch
    ist dein nachfolgender Inkrement undefiniert. Die einfachste Lösung ist,
    das du vor dem Löschen den Iterator auf das nächste Element holst. 😉

    mfg JJ



  • John Doe schrieb:

    Das kannst du so NICHT machen.
    Weil der erase() die Iterator-Variable "iter" ungültig macht. Dadurch
    ist dein nachfolgender Inkrement undefiniert. Die einfachste Lösung ist,
    das du vor dem Löschen den Iterator auf das nächste Element holst. 😉

    mfg JJ

    Du sprichst jetzt aber nicht von mir, oder?



  • Naja, ich sprech mit jedem der in einer Schleife durch "einfaches" erase Elemente aus einen sequentiellen Container z.B. vector löschen will. 🙂

    Tip von Scott Meyers: (Effective STL)

    for (SeqContainer<int>::iterator i = c.beqin(); i != c.end();) { 
      i = c.erase(i); // keep i valid by assigning erase's return value to it
    }
    

    mfg JJ



  • bei meiner variante (auch wenn ich nicht die Scott Meyers Variante benutze) bleibt der iterator gültig, da er bei jedem durch lauf neu zugewiesen wird.

    Der einzige unterschied zwischen meiner und der Scott Meyers Variante ist, das seine schneller ist.

    MfG eViLiSSiMo

    PS: Ich muss zugeben Effective STL noch nicht gelesen zu haben.



  • naja, ihr zeigt hier alle nen mehr oder wenigen performanten weg fuer std::vector<int>::clear(); 😃

    glaub was goodi wissen wollt, war eher :

    for (SeqContainer<int>::iterator i = c.beqin(); i != c.end();) { 
      if(*i == 4)
            i = c.erase(i); // keep i valid by assigning erase's return value to it
        else
            ++i;
    }
    

    (Scott Meyers Variante)

    oder :

    SeqContainer<int>::iterator i = c.beqin(); 
    while( i != c.end()) 
    { 
      if(*i == 4)
            i = c.erase(i); // keep i valid by assigning erase's return value to it
        else
            ++i;
    }
    

    aber ja, prinzip war zu erkennen ! 😃

    // funktioniert aber nur mit contaeinern, deren erase methoden einen iterator zurueckliefern ... also meist (die M$ impl kanns trotzdem, die STLPort impl kanns nich) funzt es mit assiozativen Container nich (set,map)

    aber bei assiozativen containern nimmt man dann auch andere Tricks 🙂

    Ciao ...


Anmelden zum Antworten