C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

Re: Trier une map

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French)
View previous topic :: View next topic  
Author Message
Michel Michaud
Guest





PostPosted: Sun Jul 27, 2003 4:51 pm    Post subject: Re: Trier une map Reply with quote



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





PostPosted: Sun Jul 27, 2003 6:19 pm    Post subject: Re: Trier une map Reply with quote



"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





PostPosted: Sun Jul 27, 2003 7:06 pm    Post subject: Re: Trier une map Reply with quote



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





PostPosted: Mon Jul 28, 2003 12:14 pm    Post subject: Re: Trier une map Reply with 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?
Back to top
Michael Monerau
Guest





PostPosted: Mon Jul 28, 2003 6:36 pm    Post subject: Re: Trier une map Reply with quote

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 ?
Wink
--
<=-Michaël"Cortex" Monerau.-=>



Back to top
Christophe Brun
Guest





PostPosted: Mon Jul 28, 2003 9:32 pm    Post subject: Re: Trier une map Reply with quote

"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 Surprised)



Back to top
Fabien LE LEZ
Guest





PostPosted: Tue Jul 29, 2003 1:02 am    Post subject: Re: Trier une map Reply with quote

On Mon, 28 Jul 2003 18:36:02 GMT, "Michael Monerau" <cort (AT) meloo (DOT) com>
wrote:

Quote:
'find_if' non ?

#define find find_if



--
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





PostPosted: Tue Jul 29, 2003 1:11 am    Post subject: Re: Trier une map Reply with quote

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 Surprised)

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





PostPosted: Tue Jul 29, 2003 8:47 am    Post subject: Re: Trier une map Reply with quote

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





PostPosted: Tue Jul 29, 2003 8:51 am    Post subject: Re: Trier une map Reply with quote

"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





PostPosted: Tue Jul 29, 2003 7:09 pm    Post subject: Re: Trier une map Reply with quote

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

Wink
--
<=-Michaël"Cortex" Monerau.-=>



Back to top
Mickael Pointier
Guest





PostPosted: Wed Jul 30, 2003 7:15 am    Post subject: Re: Trier une map Reply with quote

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





PostPosted: Wed Jul 30, 2003 7:34 am    Post subject: Re: Trier une map Reply with quote

"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





PostPosted: Wed Jul 30, 2003 12:15 pm    Post subject: Re: Trier une map Reply with quote

Et personne n'a d'idées sur la méthode à employer avec les enum?
Back to top
Zoubidaman
Guest





PostPosted: Thu Jul 31, 2003 10:21 pm    Post subject: Re: Trier une map Reply with quote

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
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (French) All times are GMT
Page 1 of 1

 
Jump to:  
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


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.