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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°1098054
NounouRs
Non parce que c pas mon pied !
Posté le 26-05-2005 à 14:29:35  profilanswer
 

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
mood
Publicité
Posté le 26-05-2005 à 14:29:35  profilanswer
 

n°1098081
skelter
Posté le 26-05-2005 à 14:37:17  profilanswer
 

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

n°1101962
NounouRs
Non parce que c pas mon pied !
Posté le 30-05-2005 à 17:27:24  profilanswer
 

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
n°1101965
NounouRs
Non parce que c pas mon pied !
Posté le 30-05-2005 à 17:30:41  profilanswer
 

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
n°1101976
skelter
Posté le 30-05-2005 à 17:41:35  profilanswer
 

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

n°1125062
NounouRs
Non parce que c pas mon pied !
Posté le 20-06-2005 à 11:11:55  profilanswer
 

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
n°1125079
NounouRs
Non parce que c pas mon pied !
Posté le 20-06-2005 à 11:36:24  profilanswer
 

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
n°1125238
Taz
bisounours-codeur
Posté le 20-06-2005 à 14:53:33  profilanswer
 

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.

n°1125348
NounouRs
Non parce que c pas mon pied !
Posté le 20-06-2005 à 16:44:07  profilanswer
 

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
n°1125453
Taz
bisounours-codeur
Posté le 20-06-2005 à 18:10:06  profilanswer
 

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

mood
Publicité
Posté le 20-06-2005 à 18:10:06  profilanswer
 

n°1125639
NounouRs
Non parce que c pas mon pied !
Posté le 20-06-2005 à 21:42:46  profilanswer
 

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

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

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

 

Sujets relatifs
[C] Comment définir un type de donnée binaire de taille variable ?definir un tableau en VB6
Comparaison de dates sous VBA[javascript]Définir variable
[proba] Comparaison de 2 randomfonction de comparaison
définir mémoire[Access / ASP ] Comparaison heure (access) et chaine (ASP) [resolu]
Comparaison de dates sous Mysql depuis PHPdéfinir les dimensions d'une fenêtre et sa fermeture automatique
Plus de sujets relatifs à : MAP (::STL) - Definir un nouvel operateur de comparaison


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