Iteratoren



  • Hi 🙂

    Mir ist etwas bei den Iteratoren aufgefallen. Da gibt es den Unterschied zwischen begin und cbegin. Zugehörig gibts auch end und cend. Siehe z. B. http://msdn.microsoft.com/en-us/library/dd779436.aspx

    Nun dachte ich mir, dass zu einem begin immer ein end, und zu einem cbegin immer ein cend gehört. Seltsamerweise kann man aber auch ein cbegin mit einem end kombinieren.

    Wie programmiert man denn das nun sauber korrekt?


  • Mod

    Wie programmiert man denn das nun sauber korrekt?

    Einfach konsequent bleiben? Was ist daran so schwer?

    Und ein cbegin() passt nicht immer zu einem end() , weil diese Funktionen zwei verschiedene Iteratorentypen zurückgeben, und bspw. ein Funktionstemplate so die Argumente nicht konsistent deduzieren kann.

    Edit: Untereinander sind diese beiden Iteratortypen durchaus kompatibel: So ist der Rückgabetyp von begin / end -Funktionen, also ein iterator *, immer einem const_iterator desselben Containers zuweisbar. Zudem sind sie auch vergleichbar usw.

    * Damit sind natürlich die Memberfunktionen von STL-Containern gemeint; die globalen begin / end / cbegin / cend Funktionen können auch auf Arrays angewandt werden, in welchem Fall sie einen Zeiger zurückliefern.



  • Widersprichst du dich da nicht selbst?

    Einerseits:

    ein cbegin() passt nicht immer zu einem end()

    Andererseits:

    Untereinander sind diese beiden Iteratortypen durchaus kompatibel


  • Mod

    tröröö schrieb:

    Widersprichst du dich da nicht selbst?

    Weißt du, was ein Widerspruch ist?

    Kleiner Tipp: Ich habe "Sie passen nicht immer" und "durchaus kompatibel" gesagt.



  • tröröö schrieb:

    [...]

    ich übernehme mal das googlen für dich:
    http://stackoverflow.com/questions/12001410/what-is-the-reason-behind-cbegin-cend

    wieso std::begin / std::end mit c++11 eingeführt wurden, nicht aber std::cbegin / std::cend ist eine andere frage.


Log in to reply