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 :

Probleme de list STL et recherche


Sujet :

SL & STL C++

  1. #1
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut Probleme de list STL et recherche
    Bonjour,
    j'ulitilise la STL pour gérer une liste doublement chainee (list). J'ai besoin de faire une fonction de recherche dans cette liste, je veux donc utiliser la fonction "find(....)". Le probleme est que lorsque je l utilise directement dans le corps de mon main, ca marche bien, par contre, j aimerais creer une fonction indepedante de recherche.
    Mon probleme est que lorsque je passe en argument a une fonction la liste et l element recherché:

    list<SFunctions>::iterator FindInList(list<SFunctions> List, const SFunctions ToFind)

    je veux rechercher dans cette liste Liste l'element ToFind, puis retourner l iterateur sur l'élément trouvé, mais l objet est detruit avant d etre renvoyé.

    Comment faire?

    Merci

  2. #2
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    visiblement tu travailles uniquement avec des objets et non pas avec des pointeurs. Tu vas donc avoir un grand nombre de copies dans ton processus. Ensuite est ce que tu cherches un objet qui contient la meme information que ToFind ou bien tu cherches l'iterateur sur l'objet ToFind lui meme ?

    pourrais tu rajouter le code de la fonction stp ?

  3. #3
    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 flipper203
    list<SFunctions>::iterator FindInList(list<SFunctions> List, const SFunctions ToFind)
    Tu cherches dans uen copie,d onc logiquement l'itérateur ne sera jamais bon. Passe par référence les 2 éléments et ça ira.

  4. #4
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut
    je recherches l iterateur sur l objet ToFind qui se trouve dans ma liste, car ensuite je dois recuperer des informations dans cet objet

  5. #5
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    dans ce cas tu devrais travailler avec les pointeurs et non pas avec des copies.

    mais si tu possede ToFind pour le mettre en parametre pourquoi as tu besoin d'aller le chercher dans la liste ?

  6. #6
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut
    ma fonction est:
    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
    list<SFunctions>::iterator FindInList(list<SFunctions> List, const SFunctions ToFind)
    {
    list<SFunctions>::iterator it;
     
     
    	it = find(List.begin(), List.end(), ToFind);
     
    	if(it != List.end())
    	{
    		return ptr;
    	}
    	else 
    	{
    		cout<<"Not found"<<endl;
    	}
    }
    Je recherche l'objet a l interieur de la liste, c est a dire que la liste se cree au debut et ensuite j i besoin d acceder a des elements de la liste via un element de l'objet pour recuperer d autres informations.

  7. #7
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    je suis pas sure de comprendre. tu cherches un objet a l'interieur de ta list ou bien un objet a l'interieur d'un objet de la liste ?. de plus le code que tu as marque est faux, ptr n'existe pas tu ne peux donc pas le retourner.

    aussi si ta liste est cree au debut et ne change plus utilise une list<SFunction*> ca t'evitera d'avoir des copies partout.

  8. #8
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut
    oui pardon, c est return it, sinon je cherche dans un premier temps un objet a l interieur de ma liste, et je veux recuperer son iterateur

  9. #9
    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
    Bon, je te donne la réponse, tu as essayé au moins ?

  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
    Citation Envoyé par xxiemeciel
    je suis pas sure de comprendre. tu cherches un objet a l'interieur de ta list ou bien un objet a l'interieur d'un objet de la liste ?. de plus le code que tu as marque est faux, ptr n'existe pas tu ne peux donc pas le retourner.

    aussi si ta liste est cree au debut et ne change plus utilise une list<SFunction*> ca t'evitera d'avoir des copies partout.
    Ca restera un itérateur sur la liste copiée, donc non valide, il ne faut pas copier la liste.

  11. #11
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut
    Salut,
    la réponse a déjà été donnée.
    Il faut que tu utilises des références (je préfère par rapport aux pointeurs dans le cas présent). Je compléterais juste en disant qu'il faut que tu passes en const &.
    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
    list<SFunctions>::iterator FindInList(const list<SFunctions> & List, const SFunctions ToFind)
    {
       list<SFunctions>::iterator it;
    
    
      it = find(List.begin(), List.end(), ToFind);
    
      if(it != List.end())
      {
        return it;
      }
      else
      {
        cout<<"Not found"<<endl;
        return 0; // sinon bug du compilo
      }
    }
    Un itérateur est un pointeur donc comme tu passes par copie, il pointe sur une copie de ta liste qui est "détruite" à la fin de la méthode.

  12. #12
    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
    A priori, c'est juste &, pas const& puisqu'on veut un iterator.

  13. #13
    Membre habitué Avatar de b Oo
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    179
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2004
    Messages : 179
    Points : 185
    Points
    185
    Par défaut

    Uh, oui tu as raison, s'il veut modifier l'élément par la suite il ne faut pas un const (ce qui semble être le cas vu le prototype).
    Surtout que le compilateur ne va pas détecter ce genre d'erreurs.

    Merci Miles pour la correction.

  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
    Pas de pb, on est du même avis

  15. #15
    Membre averti Avatar de xxiemeciel
    Inscrit en
    Juin 2005
    Messages
    371
    Détails du profil
    Informations forums :
    Inscription : Juin 2005
    Messages : 371
    Points : 352
    Points
    352
    Par défaut
    Salut,

    ben je comprend pas votre solution, deja comment peux tu retourner 0 si la signature de la fonction attend un iterator, ca ne peut fonctionner qu'avec un pointeur ou alors retourne list.end().

    ensuite je ne comprend toujours pas pourquoi il va chercher l'iterateur pour acceder a un objet qu'il a deja en parametre. soit il a besoin de l'iterateur pour une raison precise (genre faire un erase ou un insert) soit il a besoin de l'objet et la ben pas besoin de la fonction puisque il a deja l'objet qu'il cherche.

  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
    Je ne vois pas l'intérêt de réecrire une fonction, il suffit d'utiliser std::find...

  17. #17
    Nouveau membre du Club
    Inscrit en
    Juin 2006
    Messages
    66
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 66
    Points : 29
    Points
    29
    Par défaut
    Bon, je ne veux pas trop rentrer dans le detail mais j'ai deux classes, une classe Module et SFunctions. J ai une liste chainee de la classe SFunctions a l interieur de la classe Module. Je dois faire une fonction de recherche pour retrouver un objet de la liste chainee B. Cette fonction doit etre externe parce qu elle va etre utilisée par dautres bout de code pour recuperer l iterateur de l objet B voulu (pour le moment je fai une recherche directement par objet mais a l avenir je pense que ma recherche s effectuera via un autre critere), quoi qu il en soit, pour le moment mon souci est de recuperer cet iterateur.
    Avec donc la fonction :

    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
    list<SFunctions>::iterator FindInList(list<SFunctions> &List, const SFunctions ToFind)
    {
    	list<SFunctions>::iterator iter;
     
    	iter = find(List.begin(), List.end(), ToFind);
     
     
    	if(iter != List.end())
    	{
    		return iter;
    	}
    	else 
    	{
    		cout<<"Not found"<<endl;
    		return 0;
    	}
    }
    Mon appel de fonction est le suivant:
    i
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    ter = FindInList((M1.listSFunctions), S3); avec:
    Module M1;
    SFunctions S1;
    En executant la fonction, j'arrive finalement a recuperer l'iterateur sur l'élément trouvé.

    Merci a vous pour votre aide!

  18. #18
    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
    Super, n'oublie pas les balises code et le bouton résolu

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. probleme conteneur <list> de la bibliotheque STL
    Par khaledmoez dans le forum C++
    Réponses: 2
    Dernier message: 06/12/2009, 19h48
  2. Probleme fonction sort d'unt list STL
    Par Brouzouf dans le forum Visual C++
    Réponses: 4
    Dernier message: 27/07/2006, 17h54
  3. Probleme de liste STL
    Par flipper203 dans le forum SL & STL
    Réponses: 18
    Dernier message: 17/07/2006, 14h49
  4. un probleme de listing de dossier
    Par bidoo dans le forum Langage
    Réponses: 2
    Dernier message: 01/11/2005, 12h18
  5. Réponses: 8
    Dernier message: 02/04/2004, 18h31

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