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?
-
Wie programmiert man denn das nun sauber korrekt?
Einfach konsequent bleiben? Was ist daran so schwer?
Und ein
cbegin()
passt nicht immer zu einemend()
, 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 einiterator
*, immer einemconst_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
-
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-cendwieso std::begin / std::end mit c++11 eingeführt wurden, nicht aber std::cbegin / std::cend ist eine andere frage.