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

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

Marsh Posté le 14-03-2007 à 18:01:11    

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
Reply

Marsh Posté le 14-03-2007 à 18:01:11   

Reply

Marsh Posté le 14-03-2007 à 18:09:43    

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
Reply

Marsh Posté le 14-03-2007 à 18:15:19    

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
Reply

Marsh Posté le 14-03-2007 à 18:48:05    

ok merci, je vais essayer ça !

Reply

Marsh Posté le 19-03-2007 à 17:30:30    

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

Reply

Marsh Posté le 19-03-2007 à 17:54:36    

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?

Reply

Marsh Posté le 19-03-2007 à 18:03:09    

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

Reply

Marsh Posté le 19-03-2007 à 22:26:04    

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
Reply

Marsh Posté le 19-03-2007 à 23:20:55    

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

Reply

Marsh Posté le 20-03-2007 à 07:13:01    

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() ?  
 

Reply

Marsh Posté le 20-03-2007 à 07:13:01   

Reply

Marsh Posté le 20-03-2007 à 08:39:39    

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().

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed