frage bzgl. iteatoren und containern

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Ich versuch das mal:
    Es gibt verschiedene Container, die ähnlich angesprochen werden können. In diese Container kannst du Daten laden.
    Diese Daten werden in den Containern nach verschiedenen Kriterien abgelegt. Je nach dem was du vorhast ist mal der eine oder mal der andere von Vorteil. z.B. gibt es
    Container in denen die Daten sortiert vorliegen - andere erlauben keine Duplikate, wieder andere schon. Um an die Daten in den Containern zu gelangen brauchst du die Iteratoren, denn du möchtest ja wissen welche Daten wo in der Kiste ( = Container ) sind, um diese zu Beispiel nach bestimmten Vorgaben in andere Container zu verschieben oder auszudrucken.

    MfG bcc-fan
  • Die Erklärung von bcc-fan war schon ganz gut und sehr einfach, respekt.
    Ich versuche Dir mal an einem Beispiel von std::list zu zeigen, wie Du sie praktisch einsetzt:

    Die verschiedenen Container unterscheiden sich auch in Ihrer Verwendung:
    std::list ist sehr effizient wenns darum geht eine Liste immer wieder von Anfang nach Ende zu durchlaufen und an best. Stellen Dinge rauszulöschen. Das geht sehr schnell.
    std::vector ist dafür gedacht, Elemente direkt anzusprechen, über den []-operator. Das durchlaufen von vorne nach hinten ist weniger effizient als bei std::list.
    std::stack repräsentiert einen Stack, auf dem man nur die Elemente vorne und hinten ansprechen kann.
    std::deque weiss ich grade nicht mehr :D sorry *g*

    Nehmen wir an, du möchtest Kisten in einen Container sortieren oder sie eben abfragen, um beim Beispiel von bcc-fan zu bleiben.
    Ich nehme mal an, dass unsere std::list eine endliche Zahl von Objekten enthält:

    Quellcode

    1. // Als gegeben
    2. struct MeinObjekt
    3. {
    4. int a;
    5. };
    6. // Definieren der Liste:
    7. std::list<MeinObjekt> Liste;
    8. // Die Liste würde nun befüllt werden.. geht so:
    9. Liste.push_back(MeinObjekt());
    10. // Nun lassen wir uns einen Iterator geben und zwar den, der am Anfang der Liste sitzt:
    11. std::list::iterator& KisteAnfang = Liste.begin();
    12. // Vergleichen mit NULL bringt hier nix, da das eine Referenz ist. Wenn man also wissen will, ob noch ein Objekt folgt, vergleicht man mit dem Ende:
    13. int i = 0;
    14. for ( KisteAnfang; KisteAnfang != Liste.end(); ++KisteAnfang; )
    15. {
    16. // Zum verwenden des Objekts und nicht des iterators verwenden wir den Dereferenzierungsoperator *
    17. *it.a = i;
    18. ++i;
    19. }
    20. //Wäre Liste ein std::vector und nicht std::list, könnten wir auch so arbeiten:
    21. for ( int i = 0; i < Liste.size(); ++i)
    22. {
    23. Liste[i] = i;
    24. }
    Alles anzeigen



    Ich hoffe, das war einigermassen verständlich.
    mfg
    superuser
    Sometimes it pays to stay in bed in Monday, rather than spending the rest of the week debugging Monday's code. ~Dan Salomon
  • Hier mal ein Link:
    de.wikipedia.org/wiki/C%2B%2B-Standardbibliothek

    Wie du siehst wird an der Implementierung noch gearbeitet.
    Da wo Tr1 in den Aufrufen steht bin ich mir nicht sicher ob dies bei den Compilern schon zuverlässig arbeitet.
    Dort solltest du ausgiebig testen.
    Ach ja deine Frage - Probleme: Da hilft nur üben und nochmals üben, damit du das beherrschen lernst ;)

    Wenn du die Container so einsetzt wie das von ihren Entwicklern beabsichtigt wurde, solltest du keine Probleme haben :D

    MfG bcc-fan