Iterator pointer



  • Ich iteriere ne liste und will testen, ob der iterator gerade auf front zeigt, ist es richtig, den Iterator so aufzulösen:

    for(std::list<Foo>::iterator iter = bar.begin(); iter != bar.end(); ++iter)
    {
      if(&*iter==&bar.front())
      {...}
    }
    

    Es kompiliert, aber ist es semantisch korrekt?



  • Vergleiche den Iterator lieber mit begin(). Das liefert ja auch einen Iterator.

    if(iter==bar.begin())
    


  • Naja ich prüfe aber auch auf bar.back() und das ist nicht äquivalent mit bar.end()



  • Was hat das damit zu tun? Deswegen kannst du doch trotzdem gegen begin() prüfen.
    Der Iterator auf das letzte Element ist dann end()-1



  • Braunstein schrieb:

    Der Iterator auf das letzte Element ist dann end()-1

    Oder rbegin().

    Alternativ:

    std::list<Foo>::iterator last = bar.end();
    std::list<Foo>::iterator end = last--;
    
    for(std::list<Foo>::iterator iter = bar.begin(); iter != end; ++iter)
    {
      if(iter==last)
      {...}
    }
    


  • Braunstein schrieb:

    Der Iterator auf das letzte Element ist dann end()-1

    Nein ist er nicht.

    Edit: Oder doch? Auf jeden Fall kann ich iter+1 usw nicht machen, was mich stört

    Meine Frage nochmal, ist die Auflösung &*iter korrekt um die Adresse des foo Elements zu bekommen?



  • Seikilos schrieb:

    Edit: Oder doch? Auf jeden Fall kann ich iter+1 usw nicht machen, was mich stört

    Das liegt daran, dass + und - nur für Random Access definiert sind. List-Iteratoren sind aber nur Bidirektional, da funktioniert nur ++ und --.

    Meine Frage nochmal, ist die Auflösung &*iter korrekt um die Adresse des foo Elements zu bekommen?

    Solange Du die Sequenz nicht änderst, ist garantiert, dass die Adressen der Elemente fix bleiben. Du darfst dann also &*iter mit &foo.back() vergleichen, ja (Solange iter != end() und foo.size() > 0).



  • Hab es verstanden,
    danke an euch beide 🙂


Anmelden zum Antworten