Bonjour,
Je n'arrive pas a convertir un reverse_iterator vers un iterator. J'ai essayé (++rev).base(), mais ca n'a pas l'air de fonctionner quand ++rev donne rend().
Help me please!!!
Version imprimable
Bonjour,
Je n'arrive pas a convertir un reverse_iterator vers un iterator. J'ai essayé (++rev).base(), mais ca n'a pas l'air de fonctionner quand ++rev donne rend().
Help me please!!!
Salut,
Pourquoi ++ ?
Juste rev.base() devrait fonctionner normalement.
MAT.
Non en faite ca fonctionne bien. Mon problème est ailleur (mais je n'arrive pas a trouver le bug, pourtant c'est juste quelque lignes...).
Le ++ c'est parceque de base, rev_ite.base() retourne l'iterateur juste après(dans le sens initial, celui d'un iterateur normale) rev_ite.
Cela convient pour l'insertion (ou t'as besoin de l'itérateur juste apres la position où tu veux insérer) mais pas pour la suppression/modification où là t'as besoin de cette astuce.
Je remonte cette discussion.
Contrairement à ce que dit disturbedID je constate que reverse_iterator==iterator (je veux dire le pointeur implicite qui se trouve derrière). C'est lors du déréférencement d'un reverse_iterator que un "-1" est effectué sur le pointeur implicite.
Ainsi:
rbegin()==end()
begin()==rend()
*rbegin()==*(end()-1)
*rend()==*(begin()-1) soit un crash probable
Ben c'est normal.
rbegin est censé être un itérateur vers le premier élément en partant de la fin, c'est-à-dire le dernier élément.
rend est censé être un itérateur au-delà de la fin, et le déréférencer est un comportement indéfini.
Il semble que l'usage de reverse_iterator::base() soit délicat.Code:
1
2
3 reverse_iterator rit=vector.rbegin(); iterator it=rit.base(); valueref=*it;//crash !
Rien de délicat là-dedans : tu n'as juste pas le droit de déréferencer un itérateur past-the-end. Ça n'a rien à voir avec reverse_iterator, c'est quelque chose de vrai pour tout itérateur.
Perso je trouve assez particulier que le déréférencement d'un reverse_iterator soit valide alors que la même opération après conversion en iterator via base() ne l'est pas.
Salut,
Mais non, c'est normal, car la conversion d'un reverse iterator en un iterator (et vice versa) est par nature"suspecte"...
Comme l'a fait valoir louffoque:
- (r)begin() renvoie le premier élément dans l'ordre envisagé
- (r)end() renvoie ce qui se trouve après le dernier élément valide dans l'ordre envisagé
Donc, le fait de convertir un itérateur en reverse iterateur ou vice verrsa occasionne, pour une valeur particulière (équivalente à (r)end()) occasionne l'obtention d'un itérateur invalide.
Or, tout ce que tu obtiendra en déréférençant un itérateur invalide est donc d'office une variable invalide...
Et comme, toute tentative d'accéder au contenu de cette variable invalide va occasionner un comportement indéfini, qui peut, dans le meilleur des cas, avoir comme conséquence le plantage pur et simple de l'application (SIGSEGV) ou le lancement d'un missile nucléaire sur la steppe mongole, il n'y a rien d'anormal à observer un comportement indéfini en déréférençant un itérateur "converti" ;)