Interversion elements dans une map

Interversion elements dans une map - C++ - Programmation

Marsh Posté le 16-03-2005 à 08:18:57    

Bonjour
 
Je vous explique en premier lieu la structure de mon bourdel:
 
- j'ai une classe (A) non instantiable avec en descendance plusieurs classes. (B, C etc...)  
- une map<clef, A*>
 
Je veux deplacer une classe contenue dans la map (degager la classe a la position clef1 et la remettre a la position clef2).
Je n'ai pas trouver de fonction qui font ca : http://www.sgi.com/tech/stl/Map.html
 
J'ai pense faire une copie de la classe pointee, erase l'ancienne et insert la copie avec sa nouvelle clef.
Toutefois, comme precise au debut du post, A n'est pas instantiable.  
 
Je cherche donc un moyen qui m'eviterait de faire des new en me servant d'un dynamic cast.(fortement porcain a mon sens)  :o

Reply

Marsh Posté le 16-03-2005 à 08:18:57   

Reply

Marsh Posté le 16-03-2005 à 09:26:29    

classe ? instances ? non instanciable ? virtuelle pure ? abstraite ? tu veux bien refaire la même chose mais avec du vocabulaire C++

Reply

Marsh Posté le 16-03-2005 à 09:35:20    

Taz a écrit :

classe ? instances ? non instanciable ? virtuelle pure ? abstraite ? tu veux bien refaire la même chose mais avec du vocabulaire C++


ta gueule, retourne dans ton trou toi  :o  
 

Code :
  1. std::map<K, A*> myMap;
  2. ...
  3. std::map<K, A*>::iterator i1, i2;
  4. ...
  5. std::swap(i1->second, i2->second);


 

Reply

Marsh Posté le 16-03-2005 à 09:36:55    

Taz a écrit :

classe ? instances ? non instanciable ? virtuelle pure ? abstraite ? tu veux bien refaire la même chose mais avec du vocabulaire C++


 
Ca me parait pourtant clair qu'une classe non instantible est virtuelle pure / abstraite etc... [:izz] Si tu as besoin de ce vocabulaire pour comprendre ce que je dis, tu peux laisser les autres repondre.  [:guish]

Reply

Marsh Posté le 16-03-2005 à 09:41:05    

OK.

Reply

Marsh Posté le 16-03-2005 à 09:46:02    

schnapsmann a écrit :

ta gueule, retourne dans ton trou toi  :o  
 

Code :
  1. std::map<K, A*> myMap;
  2. ...
  3. std::map<K, A*>::iterator i1, i2;
  4. ...
  5. std::swap(i1->second, i2->second);



 
Merci pour ta reponse, mais il ne s'agit pas de swapper deux element mais d'en deplacer un. Si je passe un iterator faisand a swap, ca va peter  [:ktulu]

Reply

Marsh Posté le 16-03-2005 à 09:57:16    

Citation :

J'ai pense faire une copie de la classe pointee, erase l'ancienne et insert la copie avec sa nouvelle clef.


Ben je pense aussi que c'est ce qu'il faut faire, sauf pour la copie. Si tu associes bien un pointeur vers A à une clé, ben tu réutilises le même pointeur (pourquoi cloner la classe ?)


---------------
FAQ fclc++ - FAQ C++ - C++ FAQ Lite
Reply

Marsh Posté le 16-03-2005 à 10:00:47    

SBAM a écrit :

Merci pour ta reponse, mais il ne s'agit pas de swapper deux element mais d'en deplacer un. Si je passe un iterator faisand a swap, ca va peter  [:ktulu]


ya pas moyen.
erase + insert et c'est sur, il n'y a rien de mieux à faire avec une map pour faire ça

Reply

Marsh Posté le 16-03-2005 à 10:09:09    

SBAM a écrit :

Et donc faire du dynamic cast sur toutes les classes filles [:ktulu]  
 [:kzimir]


arrete la moquette là.
 
tu as des pointeurs dans ta map, pas besoin de recréer les instances [:mlc]
 
de + tu ne down cast pas, donc pas besoin de dynamic_cast [:itm]

Reply

Marsh Posté le 16-03-2005 à 10:18:30    

schnapsmann a écrit :

arrete la moquette là.
 
tu as des pointeurs dans ta map, pas besoin de recréer les instances [:mlc]
 
de + tu ne down cast pas, donc pas besoin de dynamic_cast [:itm]


 
size_type erase(const key_type& k)
Associative Container
Erases the element whose key is k.

Ca delete la classe ca [:huit]
 
 
Si je ne connais pas le type de ma classe, comment pourrais-je l'instancier  [:izz]  (dans l'optique d'une copie)


Message édité par SBAM le 16-03-2005 à 10:22:53
Reply

Marsh Posté le 16-03-2005 à 10:18:30   

Reply

Marsh Posté le 16-03-2005 à 10:52:25    

SBAM a écrit :


Ca delete la classe ca [:huit]
 
 
Si je ne connais pas le type de ma classe, comment pourrais-je l'instancier  [:izz]  (dans l'optique d'une copie)


Heu mais ça efface le "element type" dans la map (à savoir une pair<Key, A*> dans ton cas).
En aucun cas ton A* est passé par delete.
 
De plus pourquoi recréer tes instances???
 

Reply

Marsh Posté le 16-03-2005 à 11:22:40    

schnapsmann a écrit :


En aucun cas ton A* est passé par delete.


 
Merci  :jap: Je croyais qu'il lancait delete sur l'element.
 
Je me torturais donc l'esprit pour rien  :o


Message édité par SBAM le 16-03-2005 à 11:25:00
Reply

Sujets relatifs:

Leave a Replay

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