Warum zeigen die iteratoren der stl immer auf ein element nach dem Container



  • Hallo!

    Warum ist das so, wieso lässt man einen .end() iterator nicht aufs letzte element zeigen, sondern auf das dahinter. Was haben die sich dabei gedacht?



  • Vermutlich dass folgendes funktioniert:

    for(it=container.begin();it!=container.end();it++){
    }
    

    Wenn end() das letzte Element referenzieren würde,würde doch der container nicht voll durchlaufen. Sobald it==end() [also letztes Element] ist, wird abgebrochen.

    Naja und ich vermuter weiterhin, dass der vergleichsoperator auch bei eigenen Klassen viel leichter zu implementieren ist als zum Beispiel operator<().
    Vom logischen Standpunkt mein ich.

    Sonst könnte man ja auch wie bei iterationen über arrays arbeiten

    for(int i=0;i<arrayelemente;i++){
    }
    

    Das sind meine Vermutungen.



  • Die haben sich das dabei gedacht:

    container<sonstswas> blub;
     ichfuelledencontainer(&blub);
     container<sonstwas>::iterator start = blub.begin();
     container<sonstwas>::iterator ende  = blub.end();
      while(start != ende)
      {
        if(*start == "foobar")
           machirgendnenmisst((*start))
        ++start;
      }
    

    Man könnte auch sagen damit weis man das man auch wirklich am ende des Containers angelangt ist.

    Wenn du wirklich das letzte element haben willst kannst du es ja so herausfinden:

    container<sonstswas> blub;
     ichfuelledencontainer(&blub);
     container<sonstwas>::iterator start = blub.begin();
     container<sonstwas>::iterator ende  = blub.end();
      while(start != ende)
      {
        if(start == (ende + 1))
           break;
        else
        ++start;
      }
      // Jetzt zeigt start auf das letzte element
    


  • Gerade wegen der forschleife bin ich drauf gestoßen 😃

    Ich muss mein Projekt abgeben und da ist mir das auch eingefallen das ein .end () iterator ja eigentlich aufs element nach dem letzten element zeigt.

    Nur ich muss das ja auch begründen, nachher darf ich mir anhören wieso ich den denn ins nichts zeigen lasse bla bla.



  • naja, da iteratoren keine wirklichen zeiger sind, und es auch andere operationen gibt die nen iterator zurueckliefern, brauchst du sowas wie nen Ungueltigkeitswert. "hinter die Liste" ist eigentlich nur nen sinnbildlicher ausdrueck, ok die funktion heisst end() 🙂 , in wirklichkeit zeigt er sonstwohin .... komischerweise andert sich die adresse ned wenn man neue elemente hinzufuegt ....

    Ciao ...



  • öhm schrieb:

    Sonst könnte man ja auch wie bei iterationen über arrays arbeiten

    for(int i=0;i<arrayelemente;i++){
    }
    

    Das funktioniert genauso (falls arrayelemente >= 0)...

    for(int i = 0; i != arrayelemente; ++i) {
    }
    

Anmelden zum Antworten