Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1123 connectés 

  FORUM HardWare.fr
  Programmation
  C++

  [C++] STL - list : doit contenir uniquement des objets dynamiques ??

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] STL - list : doit contenir uniquement des objets dynamiques ??

n°1528570
gentlefred
Posté le 14-03-2007 à 18:01:11  profilanswer
 

bonjour,
 
Soit une classe A qui contient en private un "string nom", et un "int age", et en public les methodes d'acces aux attributs.
 
J' utilise une liste qui contient des élements de type classe A.
 
Comment puis-je faire une recherche sur le nom dans cette liste à partir d'une chaine string  ?
J'ai essayé ça mais ca ne fonctionne pas:
 
...rechercher(string m)
{
   mon_iterateur = find (maliste.begin()->getNom(), maliste.end()->getNom(), m)
...
}
 
??  
Merci


Message édité par gentlefred le 19-03-2007 à 17:31:20
mood
Publicité
Posté le 14-03-2007 à 18:01:11  profilanswer
 

n°1528575
IrmatDen
Posté le 14-03-2007 à 18:09:43  profilanswer
 

Salut,

 

Si ça peut correspondre à ta classe, c'est à dire que le nom serait une clé décidant de l'égalité entre 2 objets de type A, il faut que tu redéfinisses l'opérateur== dans A, et que tu passes à find un objet doté de l'attribut nom voulu.

 

Edit: sinon, il faut que tu itères à la main et que tu regardes pour chaque itération si le nom est celui cherché.


Message édité par IrmatDen le 14-03-2007 à 18:10:18
n°1528580
Amonchakai
Posté le 14-03-2007 à 18:15:19  profilanswer
 

Salut,
   Ben, a mon avis tu n'a pas le choix : tu doit parcourir toute ta liste et ensuite comparer les éléments a la chaine que tu cherche.  
 
donc un truc du type :

Code :
  1. std::list<A>::iterator it = maliste.begin();
  2. while((it != maliste.end()) && ((*it).nom != nomCherché) )
  3.     it++;


 
[edit] grillé car je met 3h a poster 3 lignes :D Sinon, c'est clair que ça me parait plus propre de définir l'opérateur == et d'ensuite utilisé les algorithmes de la STL...

Message cité 1 fois
Message édité par Amonchakai le 14-03-2007 à 18:18:01
n°1528602
gentlefred
Posté le 14-03-2007 à 18:48:05  profilanswer
 

ok merci, je vais essayer ça !

n°1530698
gentlefred
Posté le 19-03-2007 à 17:30:30  profilanswer
 

up...
 
Une list de la stl doit-elle obligatoirement contenir des objets "dynamiques" ?

n°1530714
IrmatDen
Posté le 19-03-2007 à 17:54:36  profilanswer
 

Non, du tout -std::list<int> marche très bien par exemple>. Tu as des erreurs pour intégrer des variables créées sur la pile?

n°1530719
gentlefred
Posté le 19-03-2007 à 18:03:09  profilanswer
 

non, pas encore du moins ... j'etais juste dans la phase de conception des classes ...

n°1530824
Taz
bisounours-codeur
Posté le 19-03-2007 à 22:26:04  profilanswer
 

Amonchakai a écrit :

Salut,
   Ben, a mon avis tu n'a pas le choix : tu doit parcourir toute ta liste et ensuite comparer les éléments a la chaine que tu cherche.

 

donc un truc du type :

Code :
  1. std::list<A>::iterator it = maliste.begin();
  2. while((it != maliste.end()) && ((*it).nom != nomCherché) )
  3.     it++;
 

[edit] grillé car je met 3h a poster 3 lignes :D Sinon, c'est clair que ça me parait plus propre de définir l'opérateur == et d'ensuite utilisé les algorithmes de la STL...


seulement si c'est effectivement le sens de l'égalité. Sinon un pauvre foncteur et ça se fait tout seul. Avec search/find_if ça se fait tout simplement.


Message édité par Taz le 19-03-2007 à 22:29:37
n°1530840
Taz
bisounours-codeur
Posté le 19-03-2007 à 23:20:55  profilanswer
 

Code :
  1. #include <string>
  2. #include <list>
  3. #include <algorithm>
  4. #include <functional>
  5. using namespace std;
  6. class Foo
  7. {
  8. public:
  9.   int n;
  10.   string name;
  11. };
  12. class FindByName
  13.   : public unary_function<const Foo &, bool>
  14. {
  15. public:
  16.   FindByName(const string &name)
  17.     : name(name)
  18.   { }
  19.   bool operator()(const Foo &f) const
  20.   {
  21.     return f.name == name;
  22.   }
  23. private:
  24.   const string &name;
  25. };
  26. int main()
  27. {
  28.   Foo f;
  29.   f.name = "plop";
  30.   list<Foo> foos;
  31.   foos.push_back(f);
  32.   return "plop" == find_if(foos.begin(), foos.end(), FindByName("plop" ))->name;
  33. }

genre style

n°1530866
Amonchakai
Posté le 20-03-2007 à 07:13:01  profilanswer
 

Bonjour,
   Je me pose une question : ça ne risque pas de planter ce que tu as fait ?  
   Je m'explique : le retour du find_if() peut être foos.end() si il ne trouve pas l'élément cherché, et donc le ->name devrais déclancher une erreur non ? On aurai pas du plutôt comparer l'itérateur à foos.end() ?  
 

mood
Publicité
Posté le 20-03-2007 à 07:13:01  profilanswer
 

n°1530873
Taz
bisounours-codeur
Posté le 20-03-2007 à 08:39:39  profilanswer
 

bah oui et non. Vu que je suis niveau 70, quand je mets un "plop" dans une liste, il y est, donc je le retrouve. Maintenant dans le cas général, il faut évidemment comparer en premier l'iterator retourné avec .end().


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C++

  [C++] STL - list : doit contenir uniquement des objets dynamiques ??

 

Sujets relatifs
Au secours! VB6 : Création dynamique d'objets dans datareportRécuper les noms des variables correspondant à des objets
[C#] [Résolu] Comment communiquer avec une dll c++tableau a deux dimensions d'objets
REQUETE MATCH ca marche toujours pas !Variables Dynamiques & Fonction
[Java] Problème TableModel sous Linux uniquement[C] Des accolades "just pour le fun" ?
Info bulles uniquement CSS[Résolu][C#] Générer un PDF avec des images Dynamiques (ASP.Net 1.1)
Plus de sujets relatifs à : [C++] STL - list : doit contenir uniquement des objets dynamiques ??


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR