MAP (::STL) - Definir un nouvel operateur de comparaison

MAP (::STL) - Definir un nouvel operateur de comparaison - C++ - Programmation

Marsh Posté le 26-05-2005 à 14:29:35    

Bonjour,  
 
j'aurai voulu connaitre la difference en ces deux facon d'ajouter un element dans un MAP (STL) ?
Est-ce que ca produit une différence ?
 

Code :
  1. m_textureReMapper = new Flt2txpTxt;     // qui est un    map <int, int>
  2. m_textureReMapper->insert (Int_Pair (index, txpTextureIndex) );     // 1ere facon
  3. m_textureReMapper[index] = txpTextureIndex;     // 2eme facon


 
Maintenant la question est plus sur l'operateur de comparaison
 
 
voici les 2 map ausquels je veux rajouter un operateur de comparaison (repectivement pour le type Material et string) (peut etre que ca existe deja pour string ? je crois que oui - donc la question se pose pour Material
 
typedef std::map<Material, int> T_TrpgMat;  
 
typedef std::map<string, int> T_TrpgTexture;
 
Pouvez vous me donner la methode generale, s'il vous plait ?


Message édité par NounouRs le 30-05-2005 à 16:50:45
Reply

Marsh Posté le 26-05-2005 à 14:29:35   

Reply

Marsh Posté le 26-05-2005 à 14:37:17    

operator[] s'occupera du insert, mais peut etre que la 1ere facon est moins efficace car une paire temporaire est créée, je ne suis pas sur

Reply

Marsh Posté le 30-05-2005 à 17:27:24    

J'ai lu qu'il faut definir un nouvel operateur de comparaison  dans le "paramètre template des classes des conteneurs".
 
Je transforme donc mon type en objet, c'est ca ?
 
source : http://casteyde.christian.free.fr/ [...] x8797.html


Message édité par NounouRs le 30-05-2005 à 17:31:04
Reply

Marsh Posté le 30-05-2005 à 17:30:41    

Mais j'ai lu ailleur qu'il fallait aussi un "constructeur par défaut (sans argument)".
 
http://www.sm.u-bordeaux2.fr/~parisy/C++/stl.php
 
et aussi  
 
http://www.sgi.com/tech/stl/Map.html


Message édité par NounouRs le 30-05-2005 à 17:34:48
Reply

Marsh Posté le 30-05-2005 à 17:41:35    

oui lit la doc, surcharge d'operator< pour le type ? ou un foncteur en 3e param template, ca doit etre detaille dans la doc

Reply

Marsh Posté le 20-06-2005 à 11:11:55    

depuis tout ce temps,
 
j'ai completement compris la surcharge de l'operateur <
je comprend aussi assez bien les classes de la stl
je connais la notion de template
 
mais je voudrais savoir s'il y a besoin de surcharger l'operateur [] et l'operateur d'affectation pour pouvoir utiliser un nouveau type (classe) dans une map
 

Code :
  1. class MGElement
  2. {
  3. public  :
  4. int materialMG, textureMG;
  5. friend bool operator < (MGElement &m1, MGElement &m2);
  6. };


 
car sans rien d'autre, à l'usage, j'ai le message d'erreur suivant :
 
error C2679: '=' binaire : aucun opérateur trouvé qui accepte un opérande de partie droite de type 'int' (ou il n'existe pas de conversion acceptable)
 
sur une ligne comme ca :  
m_FullMGmaterial2TRPGmaterial[matMG]=matTRPG;
 
matMG de type MGElement
matTRPG de type int


Message édité par NounouRs le 20-06-2005 à 11:14:13
Reply

Marsh Posté le 20-06-2005 à 11:36:24    

Je vous refait un resumé, d'un autre point de vue :
je veux définir une map comme ca :
 

Code :
  1. typedef map < MGElement, int > MG_Int_Map;


 
il me faut donc tout le necessaire pour que le type (c'est une classe) MGElement soit accepté par map..
comment faire ?
(j'ai deja defini < pour info)
 
 
 
c'est quasiment comme pour le type "complex" pour lequel on trouve pas mal de documentation sur le net.
Neanmoins, je n'arrive pas à trouver les infos necessaires et suffisantes pour surcharger mon type afin que "map" accepte sans broncher
 
 
 
 
 
 
j'ai un message :  
error C2677: '[' binaire : aucun opérateur global trouvé qui accepte le type 'MGElement' (ou il n'existe aucune conversion acceptable)
 
car je veux utiliser    m_FullMGmaterial2TRPGmaterial[matMG]
bien sur je peux definir un iterator, mais bon


Message édité par NounouRs le 20-06-2005 à 12:09:14
Reply

Marsh Posté le 20-06-2005 à 14:53:33    

vous êtes pathétique, c'est incroyable. Bon alors comment faire
 

Code :
  1. #include <map>
  2. class Foo
  3. {
  4.   int i;
  5. public:
  6.   Foo(int ii)
  7.     : i(ii)
  8.   { }
  9.   bool less(const Foo& other) const
  10.   {
  11.     return this->i < other.i;
  12.   }
  13. };
  14. inline bool operator<(const Foo& a, const Foo& b)
  15. {
  16.   return a.less(b);
  17. }
  18. #include <string>
  19. int main()
  20. {
  21.   std::map<Foo, std::string> fs;
  22.   fs[3] = "blah";
  23. }


 
 
et retournez à vos bounquin relire le chapitre sur les const. Et par pitié arrêtez avec les friend, c'est pas parce que votre enseignant est incapable qui faut le suivre aveuglément. Pas de friend.

Reply

Marsh Posté le 20-06-2005 à 16:44:07    

je comprends pas bien l'heritage de la ligne 10... ca signifie quoi     i(ii)     ?   c'est pas une classe i
 
Sinon, si j'ai 2 entiers : i1 et i2  au lieu d'avoir seulement 1 entier i  , que dois-je ecrire.
 
Je fouille mes livres pour repondre de mon coté.

Code :
  1. # class Foo
  2. {
  3.   int i1, i2;
  4. public:
  5.   Foo(int ii1, int ii2)
  6.     : i1(ii1)   ???????
  7.   { }
  8.   bool less(const Foo& other) const
  9.   {
  10.        on va dire que c'est fait
  11.   }
  12. };
  13. inline bool operator<(const Foo& a, const Foo& b)
  14. {
  15.   return a.less(b);
  16. }


 
parceque c'est bon, j'ai corrigé l'histoire de l'operateur de comparaison, mais pour l'instant, je ne peux toujorus pas faire de    toto[truc] = machin


Message édité par NounouRs le 20-06-2005 à 16:59:30
Reply

Marsh Posté le 20-06-2005 à 18:10:06    

y a pa d'héritage. Et c'est parce que c'est pas une classe qu'il n'y a pas de constructeur.

Reply

Marsh Posté le 20-06-2005 à 18:10:06   

Reply

Marsh Posté le 20-06-2005 à 21:42:46    

Je voudrai etre certains que la partie  
#   Foo(int ii)
#     : i(ii)
#   { }
 
Concerne bien les operateurs permettant l'utilisation directe dans un map de  
truc map <Foo, int>;
Foo f;
truc[f] = 3;
 
Car chez moi, sans rien faire, le compilateur me repond que l'operateur [ n'est pas defini.
 
Et aussi comment adapter ca à int i1, i2; ????? Car c'est aussi là que je bloque.
 

Code :
  1. Foo(int ii1, int ii2)
  2.    : i1(ii1) , i2(ii2)
  3.   { }


 
C'est ca ?


Message édité par NounouRs le 21-06-2005 à 15:56:30
Reply

Sujets relatifs:

Leave a Replay

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