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 :

STL : comment récuperer et reconnaître la position d'un itérator


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Par défaut STL : comment récuperer et reconnaître la position d'un itérator
    bonjour à tous ,
    Dans une simple boucle for, je dois effectuer des traitements spécifiques selon la position d'une liste mais je ne sais pas comment récupérer et savoir la position de l'itérateur à part .begin() et .end().
    Je veux dire je cherche un element dans la liste , si je le trouve je voudrais savoir sa position.
    extrait du code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
     
    list<Coordonne*>::iterator ii;
    for(ii=caseBonne.begin();ii!=caseBonne.end();++ii){
       temp5 = *ii;
       if(temp5==temp3){
          trouve = true ;
          Coordonne temp4(2,0);
       }
    }
    Et j'ai besoin de connaître la position à laquelle l'élément a été trouvé.
    Est ce qu'il y a une fonction spécifique qui retourne la position de l'itérateur ??

  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,

    Soit tu comptes en incrémentant un index manuellement, soit tu utilises std::distance( caseBonne.begin(), ii ).

    MAT.

  3. #3
    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
    Par défaut
    Ceci dit, rien de plus aléatoire qu'une position dans une liste. Soit ton conteneur est fait pour avoir régulièrement des insertions et des suppressions (cas classique de la liste) et un index de position risque de perdre rapidement du sens. Soit ton conteneur est relativement fixe en taille, et autant utiliser un vecteur, l'accès par index sera immédiat.

  4. #4
    Membre éclairé Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Par défaut
    Citation Envoyé par 3DArchi Voir le message
    Ceci dit, rien de plus aléatoire qu'une position dans une liste. Soit ton conteneur est fait pour avoir régulièrement des insertions et des suppressions (cas classique de la liste) et un index de position risque de perdre rapidement du sens. Soit ton conteneur est relativement fixe en taille, et autant utiliser un vecteur, l'accès par index sera immédiat.
    oui , je me suis rendu compte qu'un vector serait plus approprié vu que l'ordre ne compte pas , je voulais juste savoir si un element de type Cordonnee est présent dans le vector , et aussi dans quelle position , c'est important pour la suite

    Mat007 >> soit tu utilises std::distance( caseBonne.begin(), ii ). oui mais , comment faire pour récuperer le résultat (position) est ce qu'il ne retourne rien void

    j'ai voulu ecrire çà pour tester sa présence et pour savoir où est ce qu'il peut être s'il est présent mais çà ne marche pas ; probablement à cause du fait que c'est un vector d'objet (bout du code)

    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
     
     #include <algorithm>
    Case1->setCordonne(1,-1);
    				Case2->setCordonne(1,0);
    				Case3->setCordonne(1,1);
    				Case4->setCordonne(2,0);
     
                    // on insère dans une vectore les valeurs des vecteurs de direction
    				caseBonne.push_back(Case1);
    				caseBonne.push_back(Case2);
    				caseBonne.push_back(Case3);
    				caseBonne.push_back(Case4);
     
       vector<Coordonne*> iterator result;
     temp3 = new Coordonne(1,1); // pour verifier si (1,1) figure dans le vector 
     
       result = find( caseBonne.begin(), caseBonne.end(), temp3 );
     
       if( result == caseBonne.begin() ) {
         cout << "il est bien présent et au début "<< endl;
       }
     
       else if ( result == caseBonne.end() ) {
         cout << "il est bien présent mais à la fin " << endl;
       }
    else if( result == caseBonne.?? )  // je ne sais pas comme noter le la seconde et la troisième case 
     
     
    tout en sachant que le vector a une taille 4 (fixe )

  5. #5
    Membre éclairé Avatar de razily
    Inscrit en
    Février 2009
    Messages
    376
    Détails du profil
    Informations forums :
    Inscription : Février 2009
    Messages : 376
    Par défaut
    finalement j'ai opté pour cette solution et çà marche :
    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
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
     
     for(i=deplacement.begin(); i!= deplacement.end();i++)
    					 {
     
                              cout <<"vector dans deplacement" <<*i <<" " ;
     
    						 }
    				  i = deplacement.begin();
     
    			   temp3 = new Coordonne(3,2);
    			   val = 0;
     
    			   ii = deplacement.begin();
     
    			   while((ii!=deplacement.end())&&(trouve==0)){
     
    				   temp5 = *ii;
    				   if((*temp3==*temp5)==0){
    					   trouve = 1;
     
    					   }
    				   else {
    					   ii++;
     
    					   }
     
    				   }
     
    			   val = distance(i,ii);
     
    			   cout << "la valeur se trouve a la"<<" " << val <<" " <<  "eme position" << endl;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    affichage pion :ligne: 2colonne:3
     
    ligne: 1        colonne:-1
     ligne: 1       colonne:0
     ligne: 1       colonne:1
     ligne: 2       colonne:0
     vector dans deplacementligne: 3        colonne:2
     vector dans deplacementligne: 3        colonne:3
     vector dans deplacementligne: 3        colonne:4
     vector dans deplacementligne: 4        colonne:3
     la valeur se trouve a la 2 eme position
    Appuyez sur une touche pour continuer...

  6. #6
    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
    Par défaut
    Citation Envoyé par razily Voir le message
    j'ai voulu ecrire çà pour tester sa présence et pour savoir où est ce qu'il peut être s'il est présent mais çà ne marche pas ; probablement à cause du fait que c'est un vector d'objet (bout du code)
    Tu stockes des pointeurs dans ton vecteur. Donc la comparaison se fait sur les adresses et non les valeurs. D'où l'échec de ta recherche.
    Coordonne n'est probablement pas un type polymorphe (plutôt une sémantique de valeur), pourquoi ne pas le stocker par valeur : std::vector<Coordonne> ?

  7. #7
    Membre éclairé
    Inscrit en
    Avril 2005
    Messages
    1 110
    Détails du profil
    Informations forums :
    Inscription : Avril 2005
    Messages : 1 110
    Par défaut
    Dans ce cas il vaut mieux faire le comptage soi-même car std::distance() n'est pas très efficace avec les listes.

    EDIT: et +1 avec 3Darchi

  8. #8
    Membre Expert
    Avatar de Joel F
    Homme Profil pro
    Chercheur en informatique
    Inscrit en
    Septembre 2002
    Messages
    918
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 45
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur en informatique
    Secteur : Service public

    Informations forums :
    Inscription : Septembre 2002
    Messages : 918
    Par défaut
    et si t'as besoin d'un index, tu utilsie le pas bon conteneur:



    Edit: ca m'appendra a pas regarder ce que je copy/paste :o
    Edit 2: rehost pr eviter le hotlink

  9. #9
    Membre Expert
    Avatar de Goten
    Profil pro
    Inscrit en
    Juillet 2008
    Messages
    1 580
    Détails du profil
    Informations personnelles :
    Âge : 34
    Localisation : France

    Informations forums :
    Inscription : Juillet 2008
    Messages : 1 580
    Par défaut
    Je pense que tu t'es trompé de lien :p. (mais +1)

Discussions similaires

  1. Comment récuperer la position et les dimensions d'un HTA
    Par ProgElecT dans le forum VBScript
    Réponses: 2
    Dernier message: 07/01/2012, 13h47
  2. Réponses: 2
    Dernier message: 15/04/2008, 22h14
  3. Comment récuperer la position d'une cellule avec un Range.
    Par branqueira dans le forum VBA Access
    Réponses: 1
    Dernier message: 28/05/2007, 11h39
  4. [C#]Comment récuperer la position absolue du curseur de la souris?
    Par PerpetualSnow dans le forum Windows Forms
    Réponses: 1
    Dernier message: 28/08/2006, 11h13
  5. Comment récuperer des informations d'un .swf (flash) ?
    Par diado dans le forum API, COM et SDKs
    Réponses: 7
    Dernier message: 12/01/2004, 21h32

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