Wie kopiere/lösche ich Elemente aus einer Liste?



  • Ich habe 3 Liste, die ein und dasselbe Objekt speichern können:

    list<node*> mainlist;
    list<node*> send;
    list<node*> recv;
    list<node*> err;
    

    Ich muss die erste Liste mainlist durchsuchen und falls ein Objekt eine gewisse Eigenschaft besitzt, dann
    1. Entweder in send, oder in recv Liste kopieren (am Ende zum Bsp.).
    2. Vom mainlist der Zeiger löschen.
    Falls Objekte aus mainlist eine andere spezifische Eigenschaft besitzen, dann müssen sie in err auch verschieben werden.
    Ich brauche etwas ähnliches wie copy_if, oder remove_if.



  • du könntest die mainlist mit einer for-schleife durchlaufen und die objekte auf diese bestimmte eigenschaft hin prüfen. wenn diese zutrifft, kopierst bzw. löschst du dein objekt..
    ungefähr so?

    for(list<node*>::const_iterator it = mainlist.begin(); it != mainlist.end(); it++) {
      if((*it)->getObjectAttribute() == irgendwas) {
        // hier dann push_back() etc.
      }
    }
    


  • Wobei - bei list'en würde ich dir empfehlen, dich mal genauer mit splice() zu beschäftigen:

    while(!mainlist.empty())
    {
      list<node*>::iterator p=mainlist.begin();
      switch((*p)->type)
      {
      case SEND: send.splice(send.end(),mainlist,p);break;
      case RECV: recv.splice(recv.end(),mainlist,p);break;
      default:   err.splice(err.end(),mainlist,p);break;
      }
    }
    


  • CStoll, sehr interessantes Beispiel. Ist slice eine Funktion aus STL? Also diese Funktion "schneidet" spezifische Elemente von der Liste? Und dann kopiert sie diese in einer anderen Liste am Ende?



  • Ja, ist sie - genauer gesagt ist das eine Memberfunktion von std::list<> (d.h. der obige Code klappt nur mit list<> - für andere Container mußt du die Werte per push_back() einfügen und per erase() aus der Ausgangsliste rausschmeißen).

    a.slice(pos,b,org);
    

    kappt das Element *org aus der Liste b und fügt es an pos in Liste a ein.
    (es gibt noch Überladungen für "komplette Liste b" und "Elemente [org1,org2[ aus b")



  • Ok danke sehr!


Anmelden zum Antworten