iterator auf begin()-1 setzen



  • Funktioniert sowas überhaupt?

    const std::vector<User*> &user= company.getUser();
      std::vector<User*>::const_iterator user_it;
    
      for( user_it = user.begin(); user_it != user.end(); user_it++ )
      {
        const std::vector<User*> &team = (*user_it)->getTeamMembers();
        std::vector<User*>::const_iterator team_it;
    
        team_it = team.begin() - 1;
        while( ++team_it != team .end() )
        {
          std::cout << (*team_it)->getName() << std::endl;
        }
      } 
    }
    

    ich hätte es ja so geschrieben:

    team_it = team.begin();
    while(team_it != team.end()){
      std::cout  << (*team_it)->getName() << std::endl;
      team_it++;
    }
    

    so schauen die Klassen aus:

    class User
    {
      private:
       std::string name;
       std::vector <User*> teammember;
    ...
    }
    
    class Company
    {
      private:
        std::vector <User*> users;
    }
    

    Ich muss es aber wie oben angegeben verwenden. Wenn ich es wie oben verwende bekomme ich einen Fehler in Zeile 9 (team_it = team.begin() - 1;). Was mache ich falsch?



  • team.begin() - 1 ist nicht definiert. Schreib halt

    for(team_it = team.begin() - 1; team_it != team.end(); ++team_it)
    


  • Fehler posten wäre ganz nett.
    (Ist das überhaupt ein Compiler-Fehler gewesen? )

    seldon schrieb:

    team.begin() - 1 ist nicht definiert. Schreib halt

    for(team_it = team.begin(); team_it != team.end(); ++team_it)
    

    FIFY



  • Sone schrieb:

    FIFI

    FTFY. Aber was haben Hundenamen hier verloren?



  • Das dürfte in diesem spezial Fall evtl. klappen.

    Die Iteratoren von vector sind häufig in der implementierung pointer, so dass am ende da nur pointerarithmetik ist.
    Und weil die Schleife direkt wieder hochzählt, muss er mit begin() -1 starten, damit er das erste Mitglied nicht überspringt.
    Aber dass ist alles andere als sauberer code, alle elemente eines vectors lassen sich eleganter durchgehen, wie du schon erkannt hattest.



  • Sone schrieb:

    Fehler posten wäre ganz nett.
    (Ist das überhaupt ein Compiler-Fehler gewesen? )

    seldon schrieb:

    team.begin() - 1 ist nicht definiert. Schreib halt

    for(team_it = team.begin(); team_it != team.end(); ++team_it)
    

    FIFY

    Compiler-Fehler ist es keiner. Wenn ich das Programm starte stürzt er in Zeile 9 mit folgender Fehlermeldung ab Debug Assertion Failed! Expression: ("_Myptr + _Off <= ((_Myvec *)(this->_Mycont))->_Mylast '&&' _Myptr + _Off >= ((_Myvec *)(this-> _Mycont))->_Myfirst",0)

    Wenn ich es durchdebugge funktioniert das team.begin() noch (stehen auch die richtigen Daten drinnen), dass -1 ruft den - Operator vom vector auf, der wiederrum ruft den -= Operator, welcher den +=operator aufruft in welchem er (mit obiger Fehlermeldung) abstürzt in der Zeile:
    _SCL_SECURE_VALIDATE_RANGE( _Myptr + _Off <= ((_Myvec *)(this->_Mycont))->_Mylast '&&' _Myptr + _Off >= ((_Myvec *)(this->_Mycont))->_Myfirst);

    phlox81 schrieb:

    Das dürfte in diesem spezial Fall evtl. klappen.

    Die Iteratoren von vector sind häufig in der implementierung pointer, so dass am ende da nur pointerarithmetik ist.
    Und weil die Schleife direkt wieder hochzählt, muss er mit begin() -1 starten, damit er das erste Mitglied nicht überspringt.
    Aber dass ist alles andere als sauberer code, alle elemente eines vectors lassen sich eleganter durchgehen, wie du schon erkannt hattest.

    Weiß ich, nur muss ich mich an die Angaben halten, leider!


  • Mod

    123kid schrieb:

    Wenn ich es durchdebugge funktioniert das team.begin() noch (stehen auch die richtigen Daten drinnen), dass -1 ruft den - Operator vom vector auf, der wiederrum ruft den -= Operator, welcher den +=operator aufruft in welchem er (mit obiger Fehlermeldung) abstürzt in der Zeile:

    In dem Code, den du uns zu der Fehlermeldung gezeigt hast, ist aber kein -1 mehr drin. Du sollst den gesamten Code der while-Schleife

    team_it = team.begin() - 1;
        while( ++team_it != team .end() )
    

    durch die for-Schleife ersetzen:

    for(team_it = team.begin(); team_it != team.end(); ++team_it)
    

    Dann funktioniert das auch. Pass auf, in seldons Code war ein Fehler, nimm die Version von Sone oder mir.



  • cooky451 schrieb:

    Sone schrieb:

    FIFI

    FTFY. Aber was haben Hundenamen hier verloren?

    Die Namen ihrer Kekse. Na. Da haben sie doch schon einen gefunden. 😃

    @TE:
    Ab C++11 kannst du auch ganz bequem range-based for benutzen:

    for( auto const& t : team )
          std::cout << t.getName() << '\n';
    


  • SeppJ schrieb:

    123kid schrieb:

    Wenn ich es durchdebugge funktioniert das team.begin() noch (stehen auch die richtigen Daten drinnen), dass -1 ruft den - Operator vom vector auf, der wiederrum ruft den -= Operator, welcher den +=operator aufruft in welchem er (mit obiger Fehlermeldung) abstürzt in der Zeile:

    In dem Code, den du uns zu der Fehlermeldung gezeigt hast, ist aber kein -1 mehr drin. Du sollst den gesamten Code der while-Schleife

    team_it = team.begin() - 1;
        while( ++team_it != team .end() )
    

    durch die for-Schleife ersetzen:

    for(team_it = team.begin(); team_it != team.end(); ++team_it)
    

    Dann funktioniert das auch. Pass auf, in seldons Code war ein Fehler, nimm die Version von Sone oder mir.

    Wie gesagt diesen Code:

    team_it = team.begin() - 1;
        while( ++team_it != team .end() )
    

    darf ich nicht verändern, weil er vorgegeben ist . Die Alternativen dafür sind mir schon klar (ich hätte es ja auch anders gemacht).
    Als wenn ich diesen Code debugge, bekomme ich den obigen Fehler. Ich möchte keine alternativen Codes (wie gesagt, sind mir bekannt), ich möchte wissen wieso dieser Code nicht funktioniert.


  • Mod

    123kid schrieb:

    Wie gesagt diesen Code:

    team_it = team.begin() - 1;
        while( ++team_it != team .end() )
    

    darf ich nicht verändern, weil er vorgegeben ist .

    Dann hilft nur eines: Buch wegschmeißen, Kurs abbrechen, Tutorial aus den Bookmarks löschen. Wo auch immer du solchen Unsinn lernst, du solltest dort nicht noch mehr lernen.

    Deine Fragestellung ist unbeantwortbar, ein Dekrement von begin() ist undefiniert. Punkt. Sei froh, dass es abstürzt, so sieht man wenigstens, dass es falsch ist.



  • SeppJ schrieb:

    123kid schrieb:

    Wie gesagt diesen Code:

    team_it = team.begin() - 1;
        while( ++team_it != team .end() )
    

    darf ich nicht verändern, weil er vorgegeben ist .

    Dann hilft nur eines: Buch wegschmeißen, Kurs abbrechen, Tutorial aus den Bookmarks löschen. Wo auch immer du solchen Unsinn lernst, du solltest dort nicht noch mehr lernen.

    Deine Fragestellung ist unbeantwortbar, ein Dekrement von begin() ist undefiniert. Punkt. Sei froh, dass es abstürzt, so sieht man wenigstens, dass es falsch ist.

    Danke. Das wollte ich eigentlich wissen (bestätigt haben). Steht halt explizit in der Angabe, dass dieser Teil nicht verändert werden darf. Ich hätte es eh anders gemacht.


Log in to reply