 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
claus.hirth@swissonline.c Guest
|
Posted: Sat Sep 06, 2003 7:36 pm Post subject: vergleich const iterator mit v.end() |
|
|
....
typedef vector < char > VT ;
VT::const_reverse_iterator i = v.rbegin() ;
VT::const_reverse_iterator ei = v.rend() ;
while ( i != ei ) // das funktioniert (1)
{ ... ++i ... }
while ( i != v.rend() ) // das funktioniert nicht,
// wird vom Compiler abgelehnt. (2)
{ ... ++i ... }
Mal davon abgesehen, dass man es so wie bei (1) machen sollte
um den Aufruf von rend nur ein einziges Mal auszulösen,
warum reklamiert mein Compiler bei (2), dass er i nicht mit dem
Ergebnis von v.rend() vergleichen kann?
Wenn ich v.rend() ersetze durch das was im STL-Header-File für
rend() steht, dann funktioniert es auch. (3) Also schafft es
gcc 3.3 20030226 irgendwie nicht die richtige Funktion auszuwählen?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Markus Schaaf Guest
|
Posted: Sun Sep 07, 2003 12:51 am Post subject: Re: vergleich const iterator mit v.end() |
|
|
<claus.hirth (AT) swissonline (DOT) ch> schrieb:
| Quote: | typedef vector < char > VT ;
VT::const_reverse_iterator i = v.rbegin() ;
while ( i != v.rend() ) // das funktioniert nicht,
warum reklamiert mein Compiler bei (2), dass er i nicht mit dem
Ergebnis von v.rend() vergleichen kann?
|
Man kann im Standard nichteinmal die Forderung finden, daß das
für normale Iteratoren funktionieren muß. Für Reverse-Iteratoren
kann man sogar zeigen, daß es nach Standard nicht funktionieren
/kann/.
Der Standard verlangt zwar, daß Iteratoren vom selben Typ
miteinander vergleichbar sind, und er verlangt auch, daß ein
»iterator« (des Containers) in den zugehörigen »const_iterator«
konvertierbar ist. Er verlangt aber eben nicht, daß ein Iterator
mit einem anderen Objekt, welches in den Iteratortypen
konvertiert werden kann, vergleichbar ist. (Er sagt AFAIK
nichteinmal, was "konvertierbar" genau heißt.)
Nun geht es oben um Reverse-Iteratoren. Wenn man die Definition
von »reverse_iterator« für »std::vector« und die Requirements für
Reverse-Iteratoren hernimmt, würde man eine Ambigious-Meldung
erwarten: Ein Reverse-Iterator kann nämlich prinzipiell in einen
Reverse-Iterator beliebigen Typs konvertiert werden. Nur schlägt
für die meisten die Konvertierung fehl. Man könnte den Vergleich
zwar als Element-Funktion deklarieren (womit man wieder
Eindeutigkeit bekommt), jedoch käme es dann auf die Reihenfolge
der Operanden an (was man eher nicht erwarten würde).
In jedem Fall ist obiger Code zu vermeiden.
| Quote: | Wenn ich v.rend() ersetze durch das was im STL-Header-File für
rend() steht, dann funktioniert es auch.
|
Ich verstehe nicht, was das aussagen soll (und ich will es
vermutlich auch gar nicht wissen).
MfG
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
claus.hirth@swissonline.c Guest
|
Posted: Sun Sep 07, 2003 5:21 am Post subject: Re: vergleich const iterator mit v.end() |
|
|
| Quote: | In jedem Fall ist obiger Code zu vermeiden.
|
Durch was soll man ihn dann ersetzen? Ist damit auch
(1) gemeint?
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
Markus Schaaf Guest
|
Posted: Sun Sep 07, 2003 9:28 pm Post subject: Re: vergleich const iterator mit v.end() |
|
|
<claus.hirth (AT) swissonline (DOT) ch> schrieb:
| Quote: | In jedem Fall ist obiger Code zu vermeiden.
Durch was soll man ihn dann ersetzen? Ist damit auch
(1) gemeint?
|
Nein. Habe ich auch nicht zitiert.
--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|