IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

conversion reverse_iterator vers iterator


Sujet :

SL & STL C++

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut conversion reverse_iterator vers iterator
    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!!!

  2. #2
    Membre Expert

    Profil pro
    Inscrit en
    Juin 2006
    Messages
    1 294
    Détails du profil
    Informations personnelles :
    Localisation : Royaume-Uni

    Informations forums :
    Inscription : Juin 2006
    Messages : 1 294
    Par défaut
    Salut,

    Pourquoi ++ ?
    Juste rev.base() devrait fonctionner normalement.

    MAT.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    90
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : Algérie

    Informations forums :
    Inscription : Octobre 2005
    Messages : 90
    Par défaut
    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.

  4. #4
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    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

  5. #5
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    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.

  6. #6
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    reverse_iterator rit=vector.rbegin();
    iterator it=rit.base();
    valueref=*it;//crash !
    Il semble que l'usage de reverse_iterator::base() soit délicat.

  7. #7
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Par défaut
    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.

  8. #8
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    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.

  9. #9
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,
    Citation Envoyé par camboui Voir le message
    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.
    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"
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  10. #10
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Citation Envoyé par koala01 Voir le message
    Mais non, c'est normal, car la conversion d'un reverse iterator en un iterator (et vice versa) est par nature"suspecte"...
    Et bien voilà ! La conversion est "suspecte", donc la méthode reverse_iterator::base() est "suspecte". Comment vérifier la validité d'un iterator après conversion par base() ?

Discussions similaires

  1. Conversion Unix vers DOS...
    Par nicosfly dans le forum Langage
    Réponses: 4
    Dernier message: 23/06/2008, 17h53
  2. [VBA-E] macro conversion excel vers csv
    Par baboune dans le forum Macros et VBA Excel
    Réponses: 9
    Dernier message: 15/07/2004, 09h23
  3. conversion Access vers SQL
    Par Bjuice2 dans le forum MS SQL Server
    Réponses: 6
    Dernier message: 23/03/2004, 13h57
  4. [langage] conversion décimal vers hexa
    Par chipster dans le forum Langage
    Réponses: 2
    Dernier message: 23/02/2004, 16h05
  5. Conversion Timestamp vers varchar
    Par stejutt dans le forum SQL
    Réponses: 4
    Dernier message: 08/01/2004, 08h46

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo