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 :

find : trouver la position d'un élément dans un vecteur


Sujet :

SL & STL C++

  1. #1
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut find : trouver la position d'un élément dans un vecteur
    Hello,

    J'ai un vecteur pour lequel j'aimerais trouver la position d'un élément donné (unicité garantie en amont). Cet indice sera utilisé pour récupérer un élément dans un autre vecteur.

    L'algorithme find me donne un itérateur, mais ensuite ?

    MErci.

  2. #2
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int pos = it_found - vector.begin();
    ou mieux
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int pos = std::distance(vector.begin(),it_found);

  3. #3
    Membre averti Avatar de Trunks
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Mai 2004
    Messages
    534
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Mai 2004
    Messages : 534
    Points : 412
    Points
    412
    Par défaut
    S'il s'agit d'un vecteur, les éléments sont contaigus, du coup, tu peux faire une soustraction entre le pointeur donné et le pointeur de début. Il y a une fonction std pour ça mais je ne me souviens plus du nom.

    Edit:

    Camboui m'a devancé, c'est std::distance que je cherchais ^^

  4. #4
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Merci !

    En revanche, le type de retour de la fonction distance m'a l'air assez tordu, dans la documentation.

    On peut sans soucis mettre ça dans un int ?

  5. #5
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    typedef std::iterator_traits<std::vector<A>::iterator >::difference_type type_distance_vect_A;
    type_distance_vect_A ma_distance;
    ma_distance = std::distance(vect.begin(),vect.end());

  6. #6
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Justement.

    Quelle est la relation entre ça et un int ?

  7. #7
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par oodini Voir le message
    Justement.

    Quelle est la relation entre ça et un int ?
    Ca va marcher sur un vecteur avec 5G elements sur une machine 64 bits qui a des int qui font 32 bits.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  8. #8
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par Jean-Marc.Bourguet Voir le message
    Ca va marcher sur un vecteur avec 5G elements sur une machine 64 bits qui a des int qui font 32 bits.
    Alors qu'avec un int, non...
    std::iterator_traits<std::vector<A>::iterator >::difference_type est défini pour que justement tu n'aies pas à te poser la question. C'est un peu lourd à écrire, je le reconnais, c'est pour ça que tu peux utiliser une typedef pour simplifier.

  9. #9
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Et si je veux rendre mon code portable 32/64 bits, comment je fais pour éviter de me trimbaler ça ? Parce que j'en besoin de cette valeur comme indice dans un autre vecteur.

  10. #10
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Citation Envoyé par oodini Voir le message
    Et si je veux rendre mon code portable 32/64 bits, comment je fais pour éviter de me trimbaler ça ? Parce que j'en besoin de cette valeur comme indice dans un autre vecteur.
    Salut,
    La seule façon de le faire sans soucis est d'utiliser le difference_type de la classe trait associée à ton itérateur. Tout le reste n'écartera pas le risque que dans une configuration donnée ou qu'avec une implémentation particulière de la STL ça ne marche pas.
    En quoi trouves-tu gênant d'utiliser : std::iterator_traits<std::vector<A>::iterator >::difference_type.
    D'autant que tu peux faire un typedef pour alléger l'écriture .

  11. #11
    Membre émérite
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 764
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 764
    Points : 2 705
    Points
    2 705
    Par défaut
    Ça me gêne, parce que l'info en question (la distance) m'est utile dans un contexte où est attendue un entier.

  12. #12
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par oodini Voir le message
    Et si je veux rendre mon code portable 32/64 bits, comment je fais pour éviter de me trimbaler ça ? Parce que j'en besoin de cette valeur comme indice dans un autre vecteur.
    Citation Envoyé par oodini Voir le message
    Ça me gêne, parce que l'info en question (la distance) m'est utile dans un contexte où est attendue un entier.
    Les indices des vecteurs sont des vector<>::size_type, qui est un type entier non signe capable de representer toutes les valeurs positives du type entier signe vector<>::difference_type.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  13. #13
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Il y a 12 ans je me fendais à faire du code compatible 16 et 32 bits. Avec le recul ça n'a servi à rien.
    En 32 bits t'as aucun soucis, std::distance() renvoit l'équivalent d'un int sur 32 bits (en fait c'est un int).
    Au fait en 64 bits, un int c'est combien de bits ?

  14. #14
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par camboui Voir le message
    Il y a 12 ans je me fendais à faire du code compatible 16 et 32 bits. Avec le recul ça n'a servi à rien.
    En 32 bits t'as aucun soucis, std::distance() renvoit l'équivalent d'un int sur 32 bits (en fait c'est un int).
    Au fait en 64 bits, un int c'est combien de bits ?
    Generalement 32. Un long fait 32 bits sous Windows, 64 bits sous Unix. size_t 64 bits partout a ma connaissance.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  15. #15
    Membre éprouvé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Points : 937
    Points
    937
    Par défaut
    Un long fait 32 bits avec un compilateur 64bits pour Windows 64 bits ???

  16. #16
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Il y a 12 ans je me fendais à faire du code compatible 16 et 32 bits. Avec le recul ça n'a servi à rien.
    Tu le faisais probablement mal, alors.
    Parce que moi j'arrive parfaitement à faire du code indépendant de l'architecture... Même indépendant de la taille en bits de char.

    Sous x86-64, bien souvent, tu as :
    int : 32 bits
    long : 64 bits
    Boost ftw

  17. #17
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par camboui Voir le message
    Un long fait 32 bits avec un compilateur 64bits pour Windows 64 bits ???
    Modele appele LLP64.

    Arrivé 10 ans apres que tout le monde se soit decide pour le modele LP64. Oui. Parce que faciliter le portage sur 64 bits des applications Windows 32 bits a ete considere comme plus important que de faciliter le portage sur Windows 64 bits des applications 64 bits deja existantes.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  18. #18
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Il me semble que rien dans la norme n'impose de taille pour les types si ce n'est :
    sizeof(char)=1
    et
    sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long)
    , non?

  19. #19
    Expert éminent

    Inscrit en
    Novembre 2005
    Messages
    5 145
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 5 145
    Points : 6 911
    Points
    6 911
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Il me semble que rien dans la norme n'impose de taille pour les types si ce n'est :
    sizeof(char)=1
    et
    sizeof(char)<=sizeof(short)<=sizeof(int)<=sizeof(long)
    , non?
    Il y a aussi des intervalles minimums.
    Les MP ne sont pas là pour les questions techniques, les forums sont là pour ça.

  20. #20
    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
    Points : 4 625
    Points
    4 625
    Par défaut
    Tu as aussi

    CHAR_BITS >= 8
    sizeof(short)*CHAR_BITS >= 16
    sizeof(long)*CHAR_BITS >= 32
    sizeof(long long)*CHAR_BITS >= 64
    Boost ftw

Discussions similaires

  1. Récupérer la position d'un élément dans la page
    Par lemok dans le forum Général JavaScript
    Réponses: 4
    Dernier message: 16/07/2007, 15h46
  2. trouver la position relative du jour dans la semaine
    Par toomsounet dans le forum Langage
    Réponses: 1
    Dernier message: 05/02/2007, 16h06
  3. Trouver la position d'une chaîne dans une chaîne
    Par taka10 dans le forum Langage
    Réponses: 1
    Dernier message: 03/01/2007, 23h18
  4. retrouver la position d'un élément dans la page
    Par Choupinou dans le forum Général JavaScript
    Réponses: 8
    Dernier message: 31/08/2006, 09h35
  5. position d'un élément dans une liste
    Par john491 dans le forum Général Python
    Réponses: 8
    Dernier message: 05/05/2006, 13h13

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