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

C++ Discussion :

Petite question a propos des itérateurs


Sujet :

C++

  1. #1
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut Petite question a propos des itérateurs
    Hello tout le monde, je voudrais savoir s'il est possible d'initialiser un iterateur de vector à une position précise (non forcément le début ou la fin)

    parce que j'ai la ligne suivante :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<struct ligne_valeurs>::iterator iter = tableau_vals.begin() ;
    et j'aimerais balader mon iterateur non pas depuis le début de mon tableau mais depuis par exemple la 5ème valeur, quelqu'un saurait il comment faire ?

    Merci pour vos réponses !

  2. #2
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Pour un std::vector, on peut faire simplement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<struct ligne_valeurs>::iterator iter = tableau_vals.begin() + 4;

  3. #3
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    merci, clair net efficace

  4. #4
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    petite question corollaire, peut on simplement récupérer la position du pointeur iter dans le tableau de vectors ?

    genre iter.pos() (je tente hein )

  5. #5
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    oui :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::distance(iter, conteneur.begin())

  6. #6
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector<struct ligne_valeurs>::iterator iter = tableau_vals.begin() + 4;
    Ca ne fonctionnera que sur un certain type d'itérateurs. Un code plus généraliste serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<ligne_valeurs>::iterator iter = tableau_vals.begin();
    std::advance(iter, 4);

  7. #7
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Miles + Laurent Gomila => merci

  8. #8
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Citation Envoyé par Laurent Gomila
    Ca ne fonctionnera que sur un certain type d'itérateurs. Un code plus généraliste serait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    std::vector<ligne_valeurs>::iterator iter = tableau_vals.begin();
    std::advance(iter, 4);
    Tout à fait, j'ai peut-être pas assez mis en exergue le fait que c'était pour un std::vector

  9. #9
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    J'en profite pour caler une petite question:
    Lorsque l'on fait
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     std::vector<ligne_valeurs>::iterator iter = tableau_vals.begin();
    std::advance(iter, 4);
    ou
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    std::vector<struct ligne_valeurs>::iterator iter = tableau_vals.begin() + 4;
    1/ Faut-il tester que le vector soit de taille >= à 4 avant de faire le +4 (ou le advance)?
    2/ Faut-il tester la validité de l'itérateur après l'itération?

  10. #10
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Bonne question... Pour ma part, je ne sais pas
    En tout cas, si tu n'es pas sûr de la taille, tu vérifies la validité de l'itérateur - il vaudra le conteneur.end() -

  11. #11
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Rien n'est indiqué par rapport à ça dans la doc, et à mon avis std::advance ne peut rien faire pour contrôler la taille passée (elle n'a pas connaissance de l'itérateur de fin du conteneur), donc lui passer une taille trop élevée provoquera certainement un comportement indéterminé. A toi donc de vérifier la taille avant l'appel.

  12. #12
    r0d
    r0d est déconnecté
    Expert éminent

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    4 264
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Ain (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Août 2004
    Messages : 4 264
    Points : 6 683
    Points
    6 683
    Billets dans le blog
    2
    Par défaut
    ok

  13. #13
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Je me permets de remonter ce topic, car sous Solaris, il semblerait que std::distance ne soit pas reconnu. En effet, la compilation de mon prog me donne :

    line 1289: Error: Could not find a match for std::distance<std::ForwardIterator, std:: Distance>(ligne_valeurs*, ligne_valeurs*) needed in MTE::cherche_corr(int, std::string )
    Cela est-il dû à une librairie manquante ? Y a-t-il une fonction alternative ? Merci !

  14. #14
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    std::distance n'a qu'un seul paramètre template dans sa version à 2 arguments et 2 pour la version à 3 paramètres. C'est quelle version que tu utilises ?

  15. #15
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Le code où ca coince :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if(std::distance(tableau_vals.begin(),iter) > 
    std::distance(tableau_vals.begin(),tableau_vals.end())){return(-1);}
    Donc il s'agit de la version à 2 arguments.

  16. #16
    Membre chevronné
    Avatar de poukill
    Profil pro
    Inscrit en
    Février 2006
    Messages
    2 155
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations forums :
    Inscription : Février 2006
    Messages : 2 155
    Points : 2 107
    Points
    2 107
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iter > tableau_vals.end()
    devrait suffire je pense pour un vector

    EDIT: en fait, de toute façon ça ne marche pas partout alors il vait mieux pas que tu l'utilises...

  17. #17
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est le premier ou le deuxième qui coince ?

  18. #18
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par Miles
    C'est le premier ou le deuxième qui coince ?
    Ca coince dès le premier. A croire qu'il ne reconnaît pas "distance"

  19. #19
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Peut-être un problème de définition de la distance ?
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    template <class InputIterator>
    inline iterator_traits<InputIterator>::difference_type
    distance(InputIterator first, InputIterator last);

  20. #20
    Membre du Club
    Inscrit en
    Mars 2006
    Messages
    156
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 156
    Points : 59
    Points
    59
    Par défaut
    Citation Envoyé par poukill
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    iter > tableau_vals.end()
    devrait suffire je pense pour un vector

    EDIT: en fait, de toute façon ça ne marche pas partout alors il vait mieux pas que tu l'utilises...
    S'il compare l'itérateur à la fin, ne va-t-il pas comparer le contenu, et non la position de l'itérateur ?

Discussions similaires

  1. [Mysql 5] Question à propos des curseurs
    Par moulefrite dans le forum Requêtes
    Réponses: 12
    Dernier message: 10/11/2006, 14h46
  2. [Sql Server 2005] Question a propos des champs unicode
    Par siaoly dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 23/06/2006, 15h00
  3. [VBA-E] Question à propos des checkbox
    Par Timfg dans le forum Macros et VBA Excel
    Réponses: 5
    Dernier message: 26/04/2005, 15h09
  4. Question a propos des modulos
    Par barthelv dans le forum Algorithmes et structures de données
    Réponses: 3
    Dernier message: 24/03/2005, 15h56

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