Remplacer un map<AnsiString,int> par un vector<pair<AnsiString,int> >

Remplacer un map<AnsiString,int> par un vector<pair<AnsiString,int> > - C++ - Programmation

Marsh Posté le 01-08-2003 à 15:16:11    

Re bonjour,
 
Il me faut un conteneur équivalent à multimap, mais sans le tri.
 
Donc il me faut un vector<pair<AnsiString,int> >.
 
Voilà où j'en suis:
 

Code :
  1. typedef pair<AnsiString,int> Paire;
  2. typedef vector<Paire> VECT;
  3. VECT toto;
  4. typedef VECT::iterator ITE;


 
Il me faudrait une fonction d'ajout d'une paire à ce vecteur, qui fasse en sorte d'ajouter ma Paire à la suite d'une paire de même clé
 
Ex: J'ai dans mon vecteur les paires suivantes:
clé1,8
clé1,14
clé3,54
clé3,0
 
Si je veux insérer clé2,14 je voudrais qu'il l'insére à la fin parce que clé2 n'existe pas encore dans les paires
 
En revanche si je veux insérer la paire clé1,51 je voudrais qu'il me l'insére juste après la dernière Clé1
 
J'ai tenté plusieurs trucs, mais sans succès...
 
Vous me proposeriez quoi?
 
Merci d'avance!!


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

Marsh Posté le 01-08-2003 à 15:16:11   

Reply

Marsh Posté le 01-08-2003 à 15:29:30    

Bon, j'en suis là, mais je pense pas que ce soit le plus efficace;
 

Code :
  1. void __fastcall TForm1::InsertVecteur(
  2.         const Paire & P)
  3. {
  4. bool ATrouveCle = false;
  5. for (ITE i = toto.begin(); i != toto.end(); ++i)
  6. {
  7.         if (i->first == P.first)
  8.         {
  9.                 ATrouveCle = true;
  10.                 //Il a trouvé, on insére à cet endroit
  11.                 toto.insert(i,P);
  12.                 break;
  13.         }
  14. }
  15. //S'il a pas trouvé ou bien s'il n'y a pas d'éléments dans le vecteur, on ajoute à la fin
  16. if (!ATrouveCle || toto.size() == 0)
  17.         toto.push_back(P);
  18. }


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

Marsh Posté le 01-08-2003 à 15:30:38    

Un map<AnsiString,vector<int> >
 
Je ne comprends pas trop bien ton problème là en fait. C'est quoi ce conteneur que tu veux ?

Reply

Marsh Posté le 01-08-2003 à 15:50:05    

Je veux un conteneur qui ait une clé et sa valeur, avec la possibilité d'avoir plusieurs clés identiques (mais contigues), donc comme multimap, mais sans le tri automatique de la clé, donc multimap ne fonctionne plus...
 
Ce qui me rapproche le plus d'un multimap<string,int> est donc un vector<pair<string,int> >
 
Mais le problème avec ce vecteur, c'est que si je fais des push_back sur des paires au hasard, les clés ne seront pas ordonnés... Or moi je veux que les Paires ayant la même clé soient côte à côte dans le vecteur, de manière à utiliser equal_range.
 
Ex d'un vecteur correct:
 
(Clé1,8) | (Clé1,0) | (Clé3,142) | (Clé2,10) | (Clé2,1420)


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

Marsh Posté le 01-08-2003 à 16:01:02    

haazheel a écrit :

Je veux un conteneur qui ait une clé et sa valeur, avec la possibilité d'avoir plusieurs clés identiques (mais contigues), donc comme multimap, mais sans le tri automatique de la clé, donc multimap ne fonctionne plus...
 
Ce qui me rapproche le plus d'un multimap<string,int> est donc un vector<pair<string,int> >
 
Mais le problème avec ce vecteur, c'est que si je fais des push_back sur des paires au hasard, les clés ne seront pas ordonnés... Or moi je veux que les Paires ayant la même clé soient côte à côte dans le vecteur, de manière à utiliser equal_range.
 
Ex d'un vecteur correct:
 
(Clé1,8) | (Clé1,0) | (Clé3,142) | (Clé2,10) | (Clé2,1420)  


 
Donc, un simple vector< pair<AnsiString, vector<int> > doit suffire, et en plus, tu n'utiliseras pas comme ça d'opération d'insertion au milieu d'un vector qui sont horribles en terme de perfs.
 
PS : pourquoi AnsiString et pas string simplement ?

Reply

Marsh Posté le 01-08-2003 à 16:13:23    

Kristoph a écrit :


 
Donc, un simple vector< pair<AnsiString, vector<int> > doit suffire, et en plus, tu n'utiliseras pas comme ça d'opération d'insertion au milieu d'un vector qui sont horribles en terme de perfs.
 
PS : pourquoi AnsiString et pas string simplement ?


 
Plus simple encore: vector< pair<AnsiString, int> >
 
Ca suffit...
 
Et comme encore une fois j'ai mal compris le problème qui m'était posé, je viens de me rendre compte que je peux tout rentrer à coup de push_back parce que les éléments vont déjà arriver dans l'ordre ;)
 
PS: Parce que Borland utilise AnsiString pour sa bibliothèque VCL et que je peux très difficilement m'en passer :o


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

Marsh Posté le 02-08-2003 à 02:34:07    

Kristoph a écrit :


 
Donc, un simple vector< pair<AnsiString, vector<int> > doit suffire, et en plus, tu n'utiliseras pas comme ça d'opération d'insertion au milieu d'un vector qui sont horribles en terme de perfs.
 
PS : pourquoi AnsiString et pas string simplement ?


 
Et quand on a des modifications à effectuer au milieu d'un conteneur, est-ce que le vecteur est encore si horrible, ou bien c'est uniquemement au niveau de l'insertion?
 
Si c'est le cas, vous me conseillez quoi? Une liste?


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

Sujets relatifs:

Leave a Replay

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