std::list und erase



  • hallo!

    ich hab bis vor kurzem noch mit vc6 rumhantiert, da ging folgender code:

    std::list<int> objs;
    // füllen...
    
    typedef ListIt std::list<int>::iterator;  /7 oder andersrum? kanns mir nie merken :-)
    
    for(ListIt it = objs.begin(); it != obj.end(); it++)
    {
       if(//Bedingung mit it-> ... )
       {
          // soll gelöscht werden
          ListIt tmp = it;
          tmp++;
          obj.erase(it);
          it = tmp;
       }
    }
    

    Nun allerdings gibt er mir manchmal, die Assert-Meldung aus, seitdem ich mit vc8 arbeite:
    iterator not incrementable

    wie löscht man denn nun richtig Elemente aus einer Liste?



  • Hallo,
    Woraus die Fehlermeldung resultiert, weiß ich nicht. Aber warum schreibst du nicht statt

    // soll gelöscht werden
          ListIt tmp = it;
          tmp++;
          obj.erase(it);
          it = tmp;
    
    ListIt next_element = obj.erase(it);
    

    ??

    Btw: Das mit dem typedef ist genau umgekehrt 😉

    Gruß Caipi



  • Caipi schrieb:

    Btw: Das mit dem typedef ist genau umgekehrt

    Irgendwo ja auch logisch:

    // Ein std::list<int>::iterator nennt sich auch ListIt
    typedef std::list<int>::iterator ListIt;
    

    und nicht:

    // Ein ListIt sich auch std::list<int>::iterator nennt
    typedef ListIt std::list<int>::iterator;
    

    Kein Yoda-Speak in C++ 🤡

    MfG SideWinder



  • Maxi schrieb:

    wie löscht man denn nun richtig Elemente aus einer Liste?

    Hallo Maxi,

    so richtig geht's mit der list-Methode remove_if, das wurde aber vom VC6 nur bedingt unterstützt, da es sich um ein Template handelt.

    int arr[] = { 2, 3, 5, 3, 9 };
        list< int > l( arr, arr + sizeof( arr )/sizeof( *arr ) );
        l.remove_if( bind2nd( equal_to< int >(), 3 ) ); // alle 3'en entfernen; benötigt #include <functional>
    

    Gruß
    Werner


Log in to reply