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

  FORUM HardWare.fr
  Programmation
  C++

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

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

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

n°474579
haazheel
Posté le 01-08-2003 à 15:16:11  profilanswer
 

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
mood
Publicité
Posté le 01-08-2003 à 15:16:11  profilanswer
 

n°474609
haazheel
Posté le 01-08-2003 à 15:29:30  profilanswer
 

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
n°474611
Kristoph
Posté le 01-08-2003 à 15:30:38  profilanswer
 

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 ?

n°474670
haazheel
Posté le 01-08-2003 à 15:50:05  profilanswer
 

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
n°474701
Kristoph
Posté le 01-08-2003 à 16:01:02  profilanswer
 

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 ?

n°474741
haazheel
Posté le 01-08-2003 à 16:13:23  profilanswer
 

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
n°475672
haazheel
Posté le 02-08-2003 à 02:34:07  profilanswer
 

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

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

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

 

Sujets relatifs
Remplacer une ligne dans un fichier[JAVASCRIPT] Remplacer une virgule par un point dans une variable
[PHP] Remplacer des caractères[C++] faire un vector de classes héritées
std:vector[C++] pb de typedef et struc/vector (rézolu)
[batch] script pour remplacer le chemin d'une imprimante par un autredans quel cas est il preferable d'utiliser vector ou linkedlist ?
que faire pour remplacer les frames?Remplacer le caractere " \ " par " \\" dans une chaine.....
Plus de sujets relatifs à : Remplacer un map<AnsiString,int> par un vector<pair<AnsiString,int> >


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