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. #21
    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
    Non, il va juste comparer les 2 itérateurs. Mais bon, ça ne marche pas pour tous les itérateurs. Pourquoi ne pas faire un != au fait ?

  2. #22
    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
    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);
    Question idiote, où retrouver la définition du template sous solaris ?

  3. #23
    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
    Non, il va juste comparer les 2 itérateurs. Mais bon, ça ne marche pas pour tous les itérateurs. Pourquoi ne pas faire un != au fait ?
    Effectivement, cela résoudrait pas mal le problème ... je vais voir.

  4. #24
    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
    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...
    Au temps pour moi, c'est bien un != qu'il fallait utiliser...

  5. #25
    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
    Ok, donc, le bout de code qui correspond à l'appel de "distance" est le suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    int MTE::cherche_corr(int posdepart, std::string corresp){
    std::vector<struct ligne_valeurs>::iterator iter = tableau_vals.begin() + posdepart;
    while (iter != tableau_vals.end ()) {
     
    if(std::distance(tableau_vals.begin(),iter) > 
    std::distance(tableau_vals.begin(),tableau_vals.end()))
            {return(-1);}
     
    if(iter -> correspondance.find(corresp) != -1)
            {break;}
    ++iter;
    }
     
    if(iter!=tableau_vals.end()){
    return(std::distance(tableau_vals.begin(),iter));}
     
    else{return(-1);}
     
    }
    La fonction renvoie la position où se trouve l'occurence à chercher, et -1, si celle-ci n'existe pas.

    J'ai besoin de la position, j'ai donc absolument besoin de "distance".

    Autre solution : Je fonctionne avec un système d'incrément parallèle (un bête entier i que je fais incrémenter en même temps que j'incrémente l'itérateur).

    Qu'en pensez-vous ?

  6. #26
    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
    Ton if qui pose problème n'est pas redondant avec la protection que tu as à l'entrée de ton while ?

  7. #27
    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
    AMHA oui... très certainement!
    Au passage, tu ne fais aucuns test sur posdepart...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    int MTE::cherche_corr(int posdepart, std::string corresp){
    std::vector<struct ligne_valeurs>::iterator iter = tableau_vals.begin() + posdepart;
    while (iter != tableau_vals.end ()) {
    
    if(iter -> correspondance.find(corresp) != -1)
            {return std::distance(tableau_vals.begin(), iter);}
    ++iter;
    }
    
    if(iter!=tableau_vals.end()){
    return(std::distance(tableau_vals.begin(),iter));}
    
    else{return(-1);}
    
    }

  8. #28
    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
    Ok, j'avais du rajouter cette condition suite à des problemes post compilation, je vais voir ce que cela donne à présent (Pourquoi n'ai je pas pensé au return plutot qu'au break ! Je vous jure ..)

  9. #29
    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
    Parce qu'on ne peut pas penser à tout, sinon les forums n'existeraient pas

  10. #30
    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
    Tout à fait

    Cela dit, l'erreur est toujours présente

    Où puis-je trouver le fichier qui décrit le template "distance", ceci afin de vérifier qu'il a bien été défini ? Puis je le redéfinir dans le programme directement ?

  11. #31
    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
    Il est dans le header iterator normalement.

  12. #32
    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
    Bon, je me demande si j'ai la possibilité de toucher à ce header là.

    Peut-on créer le template directement ? (auquel cas je le renommerai, pour ne pas créer de conflit avec le template "distance" existant)

    Si oui, où le placer dans le projet ? dans le .h avec les déclarations de classes ?

  13. #33
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 279
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 279
    Points : 11 015
    Points
    11 015
    Par défaut
    Citation Envoyé par Thordax
    Le code où ca coince :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    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.
    Cette écriture me gêne pas mal.
    Pas parce que le second appel correspond à tableau_vals.size(), mais parce que :
    - Si tu as un vecteur, alors la contiguité t'autorise à tester avec >
    - Si tu as autre chose, ton test est inutile. Si tu as dépassé, tu est déjà foutu car dans les chous et les distances que tu obtiendras n'auront aucun sens.

    Bref, si tu as une boucle un peu particulière qui fait que tu "sautes" des éléments, alors incrémente deux données : ton itérateur de position courante, et un index que tu compareras à size().

    Quand à la définition de la fonction, cela va dépendre de ton installation. Tu peux p.ex. définir un main.cpp qui tente de construire un vecteur sur un type non copiable. Il y a des chances que ta ligne d'erreur indique le fichier de définition de la classe vecteur. De là tu fouilles pour retrouver std::distance.

    Et non, tu ne pourras (et ne devras) pas patcher le fichier.

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