Anfängerfrage zu Iteratoren



  • Hey Leute!

    Ich bin neu in C++ und schaue mir gerade (für eine Prüfung) Iteratoren an, hier jetzt meine Frage:

    Es gibt ja verschiedene Kategorien von C++-Iteratoren. Woher weiß ich denn, welcher DAtentyp welchen Iterator verwendet? Z.B. verwendet ein Vector ja einen "Iterator mit wahlfreiem Zugriff", oder?

    Und was ich gelesen habe: Ein reiner Ausgabeiterator lässt sich nicht vergleichen. Wie kann ich denn dann testen, wann mein Ausgabeiterator die Datenstruktur vollständig durchlaufen hat.

    Und noch eine letzte Verständnisfrage:
    Warum gibt (z.B. bei Vector) mein_iterator.end() einen eigenen Iterator aus? Wenn man ihn doch eh nicht als Iterator an sich verwendet, da man ja eigtl nur mit dem mein_iterator.begin() arbeitet?

    Danke für die Hilfe!!



  • 1. Aus der Dokumentation.
    2. Vergleich mit end() ist schon möglich. Aber es muss keine echte Gleichheit geben (also x == y bedeutet nicht ++x == ++y)
    3. Je nach Iteratortyp kann man natürlich auch von v.end() aus arbeiten (zB v.end()-1 um einen Iterator auf das letzte Element zu bekommen). Aber viel wichtiger ist doch, dass ein end-Iterator Sinn macht, weil man beim durchlaufen durch einen Container diesen erreicht i != v.end() .



  • Hey rüdiger,

    erstmal danke für Deine Antwort!

    zu 2) Das mit der "echten Gleichheit" verstehe ich nicht ganz.. sorry. 😕
    In meiner Quelle steht das wie folgt drinnen: "Ausgabeiteratoren unterstüzen keinen Vergleich"

    zu 3) Ich habe irgendwo gelesen, dass ein Iterator das gleiche wie ein Pointer ist. Stimmt das so, kann man das so sagen?

    Der Vergleich von i und v.end() ist dann immer falsch, wenn die beiden Zeiger (sind ja zwei Iteratoren) auf unterschiedliche Stellen zeigen. Sonst true.

    Ist das so richtig, oder hab ich irgendwo ein Denkfehler drinnen?

    Vielen Dank!!



  • blub85 schrieb:

    zu 2) Das mit der "echten Gleichheit" verstehe ich nicht ganz.. sorry. 😕
    In meiner Quelle steht das wie folgt drinnen: "Ausgabeiteratoren unterstüzen keinen Vergleich"

    Echte Gleichheit:

    int a(4) b(a);
    

    Hier wird a immer gleich b bleiben, solange alle Rechenoperationen immer auf beiden ausgeführt werden. .. (Edit: erschließe ich aus dem Kontext)
    Und wie immer ist Google dein bester Freund.

    blub85 schrieb:

    zu 3) Ich habe irgendwo gelesen, dass ein Iterator das gleiche wie ein Pointer ist. Stimmt das so, kann man das so sagen?

    Ney. Ein Iterator hält intern als einzige Variable einen Pointer, um den er einen Container-spezifischen Wrapper bildet. Einen Iterator zu inkrementieren heißt bei einer verketten Liste, den Zeiger auf den Knoten seinem Nachfolger zuzuweisen; bei einem statischen Array heißt es einfach den Zeiger zu inkrementieren, usw,



  • Hacker schrieb:

    Ein Iterator hält intern als einzige Variable einen Pointer

    Muss nicht sein.

    Hacker schrieb:

    ...

    Bla bla bla, das sind irrelevante Details. Das Iterator-Konzept ist eine generalisierung von Zeigern, nichts weiter.



  • 314159265358979 schrieb:

    Hacker schrieb:

    Ein Iterator hält intern als einzige Variable einen Pointer

    Muss nicht sein.

    Was braucht ein Iterator denn noch?



  • Hacker schrieb:

    314159265358979 schrieb:

    Hacker schrieb:

    Ein Iterator hält intern als einzige Variable einen Pointer

    Muss nicht sein.

    Was braucht ein Iterator denn noch?

    Ein Zeiger ist auch ein gültiger Iterator. Ein Iterator muss nicht intern einen Pointer halten.



  • pyhax schrieb:

    Hacker schrieb:

    314159265358979 schrieb:

    Hacker schrieb:

    Ein Iterator hält intern als einzige Variable einen Pointer

    Muss nicht sein.

    Was braucht ein Iterator denn noch?

    Ein Zeiger ist auch ein gültiger Iterator.

    Natürlich, natürlich. Aber ich bezog mich auf die Iteratoren in den Containern, nicht in C-Arrays o. ä.-



  • z.b. zusätzliche Member für Checks im Debugmodus o.ä.



  • 314159265358979 schrieb:

    z.b. zusätzliche Member für Checks im Debugmodus o.ä.

    -.-
    VERDAMMT NOCH MAL. Die sind doch nichts essentielles von einem Iterator.



  • Aber im Releasemodus ist auch std::vector::iterator manchmal ein einfaches typedef auf T* ...



  • pyhax schrieb:

    Aber im Releasemodus ist auch std::vector::iterator manchmal ein einfaches typedef auf T* ...

    Ja na klar, weil es da keinen Unterschied macht -.-
    Wie gesagt, ein Iterator ist ein Wrapper um einen Zeiger. Wenn die überladenen Operatoren dann sowieso das gleiche tun wie die eines Zeigers, wozu brauchst du dann noch einen Wrapper? 😉



  • Hacker schrieb:

    Wie gesagt, ein Iterator ist ein Wrapper um einen Zeiger.

    Nein, das ist einfach grundsätzlich falsch.



  • 314159265358979 schrieb:

    Hacker schrieb:

    Wie gesagt, ein Iterator ist ein Wrapper um einen Zeiger.

    Nein, das ist einfach grundsätzlich falsch.

    Erklär'.



  • Du kannst zb. einen Iterator schreiben, der zeilenweise aus einer Datei liest. Der Iterator müsste zb einen Stream halten.

    Oder ein Beispiel aus einem meiner Projekte: https://github.com/Ethon/Berry/blob/master/include/berry/process_iterator.hpp
    Hat mit nem Pointer nichtmehr soviel zu tun. 😉



  • Ethon schrieb:

    Du kannst zb. einen Iterator schreiben, der zeilenweise aus einer Datei liest. Der Iterator müsste zb einen Stream halten.

    Oder ein Beispiel aus einem meiner Projekte: https://github.com/Ethon/Berry/blob/master/include/berry/process_iterator.hpp
    Hat mit nem Pointer nichtmehr soviel zu tun. 😉

    Naja klar, ich kenn ja auch ostream_iterator oder den Boost-Iterator für Datums-iteration.

    Gut, wenn man so allgemein über Iteratoren spricht... 🤡 Ich dachte eben der TE bezog sich mit dem Satz auf Container-Iteratoren.



  • Auch Container-Iteratoren müssen nicht Zwangsweise einen Zeiger haben. Ein std::vector::iterator könnte beispielsweise eine Referenz auf den vector sowie einen Index halten.



  • 314159265358979 schrieb:

    Auch Container-Iteratoren müssen nicht Zwangsweise einen Zeiger haben. Ein std::vector::iterator könnte beispielsweise eine Referenz auf den vector sowie einen Index halten.

    As if, Pi



  • Ach vergiss es, ich gebs auf. Du bist zu blöd dazu. Ich kann dir meine Meinung so offensichtlich wie ich will in X Posts darlegen und du willst es trotzdem nicht kapieren. Vergiss es einfach, okay?



  • 314159265358979 schrieb:

    Ach vergiss es, ich gebs auf. Du bist zu blöd dazu. Ich kann dir meine Meinung so offensichtlich wie ich will in X Posts darlegen und du willst es trotzdem nicht kapieren. Vergiss es einfach, okay?

    Sry, aber wenn ein Iterator sowas machen würde, das ... wäre einfach Dumm.


Anmelden zum Antworten