Map multiples

Map multiples - C++ - Programmation

Marsh Posté le 14-07-2003 à 22:05:32    

Hello,
 
voici mon problème:
 
j'ai les maps suivantes:
 

Code :
  1. typedef vector<int> ListeFrames;
  2.         typedef map<AnsiString, ListeFrames> ActionsUneStat;
  3.         typedef map<AnsiString, ActionsUneStat> ToutesActions;
  4.         typedef ToutesActions::iterator ite;
  5.        
  6.         ToutesActions TA;


 
Qui correspond à l'exemple suivant:
 

Citation :


Joueur1 -> Stat -> Frame
                -> Frame
                -> Frame
                -> Frame
                -> ...
        -> Stat
        -> ...
Joueur2 -> Stat -> Frame
...
...


 
Je remplis tout ça grâce à des boucles récursives qui récupèrent les infos dans un fichier XML (Je donne le code quand même)
 

Code :
  1. XML->Clear();
  2. XML->Push(0);
  3. //On scanne\\
  4. //Les équipes
  5. for (int i=0; i < 2; i++)
  6. {
  7.         XML->Modify(i);
  8.         XML->Push("Staff" );
  9.         int NbreJoueurs = XML->GetCount();
  10.         XML->Push(0);
  11.         //Les joueurs
  12.         for (int j=0; j < NbreJoueurs; j++)
  13.         {
  14.                 XML->Modify(j);
  15.                 AnsiString NomJoueur = XML->GetAttr("Nom" );
  16.                 ActionsUneStat AUS;
  17.                 XML->Push(0);
  18.                 //Les groupes de stats
  19.                 for (int k=0; k < NbreStats; k++)
  20.                 {
  21.                         XML->Modify(k);
  22.                         AnsiString NomStat = XML->GetName();
  23.                         int NbreStatsIndiv = XML->GetCount();
  24.                         //On réserve tout de suite le nombre d'actions
  25.                         ListeFrames LF(NbreStatsIndiv,0);
  26.                         if (NbreStatsIndiv > 0)
  27.                                 XML->Push(0);
  28.                         //Les stats individuellement
  29.                         for (int l=0; l < NbreStatsIndiv; l++)
  30.                         {
  31.                                 XML->Modify(l);
  32.                                 int TpsAction = StrToInt(XML->GetValue());
  33.                                 //On ajoute les actions
  34.                                 LF[l] = TpsAction;
  35.                         }
  36.                         //On ajoute une entrée Stat
  37.                         AUS.insert(ActionsUneStat::value_type(NomStat,LF));
  38.                         if (NbreStatsIndiv > 0)
  39.                                 XML->Delete();
  40.                 }
  41.                 //On ajoute une entrée joueur
  42.                 TA.insert(ToutesActions::value_type(NomJoueur,AUS));
  43.                 XML->Delete();
  44.         }
  45.         XML->Delete(2);
  46. }


 
Maintenant je voudrais récupérer les données grâce à des critères de recherche sur le ou les joueurs et sur la ou les stats...
 
Il y a la fonction find() qui renvoie un iterateur, mais je n'arrive qu'à chercher un joueur, et pas parmi ses stats...
 
Je fais comment pour avoir la liste des Frames pour une stat voulue pour un joueur voulu?
 
Merci d'avance  :jap:


---------------
Another .Net Blog
Reply

Marsh Posté le 14-07-2003 à 22:05:32   

Reply

Marsh Posté le 14-07-2003 à 22:21:00    

hein? on comprends rien là? pose nous un problème de C++ et pas tin histoire de basketteurs

Reply

Marsh Posté le 14-07-2003 à 23:15:22    

lol, c'est dur d'expliquer ce que je voudrais
 
Donc en gros mes maps sont remplies des infos voulues.
 
Ex:
 

 
"Jordan" -> "Lancers-Francs" -> 15
                             -> 48  
                             -> 67
                             -> 165
         -> "Rebonds" -> 34
                      -> 100  
         -> ...  
Joueur2 -> Stat -> Frame  
...  
...  


 
Maintenant ce que je voudrais, c'est obtenir tous les lancers-francs de Jordan...
 
Si je fais:

Code :
  1. ToutesActions::iterator I = TA.find("Jordan" );


 
Il me met l'iterateur sur Jordan, mais comment faire pour parcourir les stats (Lancers-Francs...) ainsi que les instants des Stats (15,48...)??


---------------
Another .Net Blog
Reply

Marsh Posté le 14-07-2003 à 23:48:15    

te répondrais bien juste "std::pair", mais chuis dans un bon jour, alors voila un exemple :
 

Code :
  1. // Get "jordan"
  2. ToutesActions::const_iterator i = TA.find("Jordan" );
  3. if (i != TA.end())
  4. {
  5.  const pair<string, ActionsUneStat> &Paire = *i;
  6.  const ActionsUneStat &Konar = Paire.second;
  7.  // Get "Lancers-Francs"
  8.  ActionsUneStat::const_iterator j = Konar.find("Lancers-Francs" );
  9.  if (j !=  Konar.end())
  10.  {
  11.   const ListeFrames &Frames = j->second;
  12.   // List all
  13.   for (ListeFrames::const_iterator k = Frames.begin(); k != Frames.end(); k++)
  14.   {
  15.    *k; // l'int
  16.   }
  17.  }
  18. }


 
c'est pas la solution la + élégante, mais ca te detaille bien tout ton bordel.


Message édité par Konar le 15-07-2003 à 00:01:58
Reply

Marsh Posté le 15-07-2003 à 00:08:26    

Merci beaucoup, ça marche effectivement très bien...
 
Néanmoins j'ai quelques questions:
 
C'est obligé de mettre des const?
 
Quelle serait une solution plus élégante?
 
J'ai déjà une classe qui pourrait me servir ici:
 

Code :
  1. struct ContenuUneStatUnXML
  2. {
  3. private:
  4.         vector<int> VecUneStatUnXML; //Contient chaque Frame
  5. public:
  6.         AnsiString NomStat;
  7.        
  8. //Les fonctions qui vont bien
  9. //...
  10. };


 
Dans ce cas ça ne serait pas préférable de modifier mes typedef comme suit?
 

Code :
  1. typedef vector<ContenuUneStatUnXML> VCUSUX
  2. typedef map<AnsiString, VCUSUX> ToutesActions;
  3. ToutesActions TA;


 
Je n'aurais que quelques modifs à apporter à ton code...
 


---------------
Another .Net Blog
Reply

Sujets relatifs:

Leave a Replay

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