 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Michel Michaud Guest
|
Posted: Sun Jul 27, 2003 4:51 pm Post subject: Re: Trier une map |
|
|
Dans news:9bf3cacd.0307270831.7f524352 (AT) posting (DOT) google.com,
Zoubidaman <zoubidaman (AT) hotmail (DOT) com> a écrit :
| Quote: | Admettons que j'ai la map suivante:
map<string,int> toto;
Les clés (peu importe la valeur associée) que j'insére dans la map
sont les suivantes:
LFL
LFR
T2L
T2R
T3L
T3R
RO
RD
PD
INT
CON
FP
FC
BP
Par défaut la map est triée par ordre alphabétique sur le string...
Or moi je voudrais imposer l'ordre que je viens de vous donner.
|
Je ne comprends pas c'est quoi cet « ordre », mais map permet
de donner un troisième paramètre pour indiquer l'ordre désiré.
--
Michel Michaud [email]mm (AT) gdzid (DOT) com[/email]
http://www.gdzid.com
FAQ de fr.comp.lang.c++ :
http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ/
|
|
| Back to top |
|
 |
Christophe Brun Guest
|
Posted: Sun Jul 27, 2003 6:19 pm Post subject: Re: Trier une map |
|
|
"Zoubidaman" <zoubidaman (AT) hotmail (DOT) com> a écrit dans le message de
news:9bf3cacd.0307270831.7f524352 (AT) posting (DOT) google.com...
| Quote: |
Par défaut la map est triée par ordre alphabétique sur le string...
Or moi je voudrais imposer l'ordre que je viens de vous donner.
std::map utilise une fonction d'ordonnancement, que tu peux préciser dans le |
troisième argument template lorsque tu déclares ta variable. Par défaut,
cette méthode est std::less< T >, que tu peux trouver dans <functional> et
qui fait une comparaison classique du type 'a
implémentant operator<.
Dès lors, toute la difficulté consiste à trouver ou à implémenter une
fonction qui rende les résultats qui t'intéressent, puis à utiliser cette
fonction comme méthode d'ordonnancement...
En ce qui concerne l'ordre que tu cites, je ne vois pas a priori de moyen
permettant de formuler une règle à la seule vue des valeurs.
Si tu la trouves, pas de problème.
Sinon, c'est sans doute que le map n'est pas la structure qu'il te faut.
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
Posted: Sun Jul 27, 2003 7:06 pm Post subject: Re: Trier une map |
|
|
On 27 Jul 2003 09:31:32 -0700, [email]zoubidaman (AT) hotmail (DOT) com[/email] (Zoubidaman)
wrote:
| Quote: | Or moi je voudrais imposer l'ordre que je viens de vous donner.
|
Si tu veux garder l'ordre dans lequel les données sont rentrées,
std::map n'est pas le conteneur qu'il te faut. Je te conseillerais
plutôt un "std::vector<S>" où S est une classe définie comme suit :
struct S
{
std::string cle;
int valeur;
};
[Bien évidemment, il te faut trouver un nom plus explicite que "S".]
Si tu ne laisses pas std::map mettre les données dans l'ordre, alors
ce conteneur n'a plus grand intérêt (d'optimisation) de toutes façons.
Définis aussi un foncteur pour permettre la recherche :
class CleIdentique
{
CleIdentique (S const& ref): reference (ref) {}
bool operator ()(S const& s) const { return s.cle == s.reference; }
private:
S reference;
};
Et la recherche se fait par :
int ChercheLaValeurAssociee
(std::vector<S> const& data, std::string const& cle)
{
std::vector<S>::const_iterator it=
std::find (data.begin(), data.end(), CleIdentique(cle) );
if (!it)
{
// Cle introuvable, il faut sévir (lancer une exception par
exemple)
}
return (*it).valeur;
}
A noter qu'il serait bon d'encapsuler tout ça dans une classe...
--
Tout sur fr.* (FAQ, etc.) : http://www.usenet-fr.net/fur/
et http://www.aminautes.org/forums/serveurs/tablefr.html
Archives : http://groups.google.com/advanced_group_search
http://www.usenet-fr.net/fur/usenet/repondre-sur-usenet.html
|
|
| Back to top |
|
 |
Zoubidaman Guest
|
Posted: Mon Jul 28, 2003 12:14 pm Post subject: Re: Trier une map |
|
|
Merci pour toutes vos réponses, mais je pense que je vais conserver
l'usage des maps... Classer dans l'ordre que je vous ai mentionné
n'est finalement pas si important...
Néanmoins, je me demandais s'il n'était pas possible de réaliser cela
quand même avec des enum?
|
|
| Back to top |
|
 |
Michael Monerau Guest
|
Posted: Mon Jul 28, 2003 6:36 pm Post subject: Re: Trier une map |
|
|
Fabien LE LEZ wrote:
| Quote: | On 27 Jul 2003 09:31:32 -0700, [email]zoubidaman (AT) hotmail (DOT) com[/email] (Zoubidaman)
wrote:
Et la recherche se fait par :
int ChercheLaValeurAssociee
(std::vector<S> const& data, std::string const& cle)
{
std::vector<S>::const_iterator it=
std::find (data.begin(), data.end(), CleIdentique(cle) );
|
'find_if' non ?
--
<=-Michaël"Cortex" Monerau.-=>
|
|
| Back to top |
|
 |
Christophe Brun Guest
|
Posted: Mon Jul 28, 2003 9:32 pm Post subject: Re: Trier une map |
|
|
"Zoubidaman" <zoubidaman (AT) hotmail (DOT) com> a écrit dans le message de
news:9bf3cacd.0307280414.5bf60b1a (AT) posting (DOT) google.com...
| Quote: | Merci pour toutes vos réponses, mais je pense que je vais conserver
l'usage des maps... Classer dans l'ordre que je vous ai mentionné
n'est finalement pas si important...
Néanmoins, je me demandais s'il n'était pas possible de réaliser cela
quand même avec des enum?
|
En effet, si tu utilises une enum comme clé, avec dans un coin ... un
mapping de tes clés sur 3 lettres vers l'enum, tu pourras conserver l'ordre
que tu indiques. Deux mappings, pourquoi pas... C'est un peu une variante de
cet axiome qui affirme qu'il n'existe aucun problème qu'un niveau
d'indirection supplémentaire ne puisse résoudre )
|
|
| Back to top |
|
 |
Fabien LE LEZ Guest
|
|
| Back to top |
|
 |
Zoubidaman Guest
|
Posted: Tue Jul 29, 2003 1:11 am Post subject: Re: Trier une map |
|
|
| Quote: | En effet, si tu utilises une enum comme clé, avec dans un coin ... un
mapping de tes clés sur 3 lettres vers l'enum, tu pourras conserver l'ordre
que tu indiques. Deux mappings, pourquoi pas... C'est un peu une variante de
cet axiome qui affirme qu'il n'existe aucun problème qu'un niveau
d'indirection supplémentaire ne puisse résoudre )
|
OK, c'est bien sympa tout ça ;)
Mais le problème est que je ne sais absolument pas comment réaliser ça
:(
Et quelle solution vaut-il mieux adopter: cette dernière ou bien un
vector<pair??
|
|
| Back to top |
|
 |
Mickael Pointier Guest
|
Posted: Tue Jul 29, 2003 8:47 am Post subject: Re: Trier une map |
|
|
| Quote: | Admettons que j'ai la map suivante:
map<string,int> toto;
Les clés (peu importe la valeur associée) que j'insére dans la map
sont les suivantes:
LFL
LFR
T2L
T2R
T3L
T3R
RO
RD
PD
INT
CON
FP
FC
BP
Par défaut la map est triée par ordre alphabétique sur le string...
Or moi je voudrais imposer l'ordre que je viens de vous donner.
|
Tu peux probablement aussi faire le truc horrible que j'ai du faire la
semaine dernière...
J'avait un problème de recherche linéaire au carré dans un vector, mais
j'avais besoin de conserver l'ordre d'insertion. J'ai donc conservé mon
vector (rempli a coup de pushback) de "smurtz*", et j'ai en plus inséré
mon "smurtz*" dans une "map<string,smurtz*>" qui m'a permit des
recherches par nom rapides.
J'aurait probablement pu faire mieux, mais en une heure, sur du code
existant j'ai pas trouvé mieux.
Mickael Pointier
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Tue Jul 29, 2003 8:51 am Post subject: Re: Trier une map |
|
|
"Mickael Pointier" <mpointie (AT) eden-studios (DOT) fr> writes:
| Quote: | Tu peux probablement aussi faire le truc horrible que j'ai du faire la
semaine dernière...
J'avait un problème de recherche linéaire au carré dans un vector, mais
j'avais besoin de conserver l'ordre d'insertion.
|
Truc horrible? C'est courant et j'ai travaille dans un projet ou la
hash table utilisee etant definie comme garantissant l'ordre
d'insertion et que j'ai deja refait une hash table comme ca pour un
autre projet.
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Michael Monerau Guest
|
Posted: Tue Jul 29, 2003 7:09 pm Post subject: Re: Trier une map |
|
|
Fabien LE LEZ wrote:
| Quote: | On Mon, 28 Jul 2003 18:36:02 GMT, "Michael Monerau" <cort (AT) meloo (DOT) com
wrote:
'find_if' non ?
#define find find_if
|
--
<=-Michaël"Cortex" Monerau.-=>
|
|
| Back to top |
|
 |
Mickael Pointier Guest
|
Posted: Wed Jul 30, 2003 7:15 am Post subject: Re: Trier une map |
|
|
Jean-Marc Bourguet wrote:
| Quote: | "Mickael Pointier" <mpointie (AT) eden-studios (DOT) fr> writes:
Tu peux probablement aussi faire le truc horrible que j'ai du faire
la semaine dernière...
J'avait un problème de recherche linéaire au carré dans un vector,
mais j'avais besoin de conserver l'ordre d'insertion.
Truc horrible? C'est courant et j'ai travaille dans un projet ou la
hash table utilisee etant definie comme garantissant l'ordre
d'insertion et que j'ai deja refait une hash table comme ca pour un
autre projet.
|
Ok.
Je pense que mon sentiment "d'horrification" vient du fait que le simple
rajout de cette map à fait passer la taille de mon exécutable de 450k à
576k, ce qui en soit reste insignifiant, mais bon...
tant mieux si finalement c'est pas si mal que ca ce que j'ai fait =)
Mike
|
|
| Back to top |
|
 |
Jean-Marc Bourguet Guest
|
Posted: Wed Jul 30, 2003 7:34 am Post subject: Re: Trier une map |
|
|
"Mickael Pointier" <mpointie (AT) eden-studios (DOT) fr> writes:
| Quote: | Jean-Marc Bourguet wrote:
"Mickael Pointier" <mpointie (AT) eden-studios (DOT) fr> writes:
Tu peux probablement aussi faire le truc horrible que j'ai du faire
la semaine dernière...
J'avait un problème de recherche linéaire au carré dans un vector,
mais j'avais besoin de conserver l'ordre d'insertion.
Truc horrible? C'est courant et j'ai travaille dans un projet ou la
hash table utilisee etant definie comme garantissant l'ordre
d'insertion et que j'ai deja refait une hash table comme ca pour un
autre projet.
Ok.
Je pense que mon sentiment "d'horrification" vient du fait que le simple
rajout de cette map à fait passer la taille de mon exécutable de 450k à
576k, ce qui en soit reste insignifiant, mais bon...
|
120k, c'est du bruit chez nous. (La taille de l'executable est de
250M, et c'est donc sans compter les bibliotheques dynamiques ni ce
qui est ecrit dans le langage d'extension...) Ce qui nous preoccupe
plus est la place prise par les structures meme (on met facilement
500000 elements dans les tables) et naturellement aucune des deux
tables ne dupliquaient l'information comme tu le faisais (mais
l'ecriture n'a pas pris une heure non plus).
A+
--
Jean-Marc
FAQ de fclc++: http://www.cmla.ens-cachan.fr/~dosreis/C++/FAQ
C++ FAQ Lite en VF: http://www.ifrance.com/jlecomte/c++/c++-faq-lite/index.html
Site de usenet-fr: http://www.usenet-fr.news.eu.org
|
|
| Back to top |
|
 |
Zoubidaman Guest
|
Posted: Wed Jul 30, 2003 12:15 pm Post subject: Re: Trier une map |
|
|
Et personne n'a d'idées sur la méthode à employer avec les enum?
|
|
| Back to top |
|
 |
Zoubidaman Guest
|
Posted: Thu Jul 31, 2003 10:21 pm Post subject: Re: Trier une map |
|
|
Zoubidaman <zoubidaman (AT) hotmail (DOT) com> wrote in
news:Xns93C890FEA781Ezoubidamanhotmailcom (AT) 213 (DOT) 228.0.32:
| Quote: | Et personne n'a d'idées sur la méthode à employer avec les enum?
|
Toujours personne?
|
|
| Back to top |
|
 |
|
|
You cannot post new topics in this forum You cannot reply to topics in this forum You cannot edit your posts in this forum You cannot delete your posts in this forum You cannot vote in polls in this forum
|
|