IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

SL & STL C++ Discussion :

Map & opérateur de comparaison


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut Map & opérateur de comparaison
    Hello,

    J'ai besoin de faire un map avec comme clé un pointeur de type T, et comme valeur un vecteur de flottants.

    Je n'ai pas besoin de faire de tri sur ce map. Je veux juste faire une association entre une liste de pointeurs d'objets et leur vecteur, puis itérer sur ce map
    (pour info, c'est pour ensuite itérer et construire le même map, mais en "inversé" (la clé sera le flottant, et la valeur un vecteur d'objets))

    Mon problème est que je dois fournir un opérateur de comparaison, et que je n'ai encore jamais fait ça avec la STL. Les différentes sources sur la STL que j'ai consultées sont assez obscures sur ce sujet.

    Dois-je utiliser l'opérateur equal, et redéfinir l'opérateur ==() du type T, en comparant simplement les pointeurs ? Je précise que je sais que je n'aurai pas deux pointeurs vers le même objet mémoire.

    Par ailleurs, sachant que l'unicité est garantie en entrée, serait-il plus performant ?

    Merci !

    PS : tout lien vers un site pédagogique serait le bienvenu.

  2. #2
    Membre émérite
    Avatar de Spout
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Février 2007
    Messages
    904
    Détails du profil
    Informations personnelles :
    Âge : 41
    Localisation : France, Val d'Oise (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Février 2007
    Messages : 904
    Par défaut
    Si tu n'as pas besoin d'accéder directement à une valeur via sa clé et que ton utilisation se limite à un parcours, utilise plutôt un set de pair:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    typedef std::pair<T*, std::vector<Objet>   TpairpTvObjet;
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::set<TpairpTvObjet>   myContainer;

  3. #3
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par oodini Voir le message
    Je n'ai pas besoin de faire de tri sur ce map.
    utilise un vector ou une list alors.

  4. #4
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Mongaulois >> Je pense que std::tr1::unordered_map correspond à ce qu'il veut.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  5. #5
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 035
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    je pense que std::tr1::unordered_map correspond à ce que tu veux.
    Je ne sais pas sur quel compilot la tr1 est implementé...

  6. #6
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    De façon certaine:
    g++ (<tr1/unordered_map>).
    Visual C++: (<unordered_map> doc ici)

    Après pour les autres (compilo sous mac, celui d'Intel,...) aucune idée.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  7. #7
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut TR1 OK
    Hello,

    La solution donnée par Davidbrcz est intéressante, car je ne connaissais pas cet unordered_map. Mais si je peux me passer d'inclure la TR1, j'aimerais autant...

    Comme il est vrai que je n'ai besoin que de faire un parcours, sans accès aléatoire, je vais peut-être me rabattre sur la solution de spoutspout (je ne connaissais pas non plus la structure pair).

    En revanche, je ne comprend pas bien ce que me suggérait Mongaulois, car j'avais néanmoins besoin d'un conteneur associatif.

    En tout cas, merci à tous !

    Je vous tiens au courant. :-)

  8. #8
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Mais si je peux me passer d'inclure la TR1, j'aimerais autant...
    Pourquoi donc ?
    tr1 est implémenté sur (quasiment ?) tous les compilateurs récents (comprendre pas VS C++ 6 ). Et surtout, le tr1 serra intégré à C++0x, donc pourquoi s'en priver ?
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  9. #9
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Le code ne sera compilé qu'avec Visual 2008 et ultérieurs, ainsi que g++.
    Je pourrais donc effectivement utiliser tr1.

    Et je vais sans doute d'ailleurs le faire, car l'autre solution, apparemment, semble m'obliger à constituer tout le vecteur, puis à créer la paire, ce qui m'amène en outre à considérer des problèmes de portée mémoire.

    Alors qu'un accès aléatoire me permettrait de prendre la structure la plus globale, et d'y ajouter directement mes flottants.

  10. #10
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Cela dit, je n'arrive pas à avoir accès à TR1.

    L'autocomplétion ne m'y donne pas accès après std::...

    Y'a un include à faire ou quelque chsoe à configurer ?

    Je précise que le SP1 de Visual est installé.

  11. #11
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Bon, ben lTR1 se trouve dans Visual C++ 2008 Feature Pack, qui n'existe que pour Visual C++ en anglais, apparemment.
    Sinon, il faut attendre Visual Studio SP1.

    Donc, c'est mort.

  12. #12
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Mongaulois >> Je pense que std::tr1::unordered_map correspond à ce qu'il veut.
    Pourquoi utiliser une hash_map ?
    Ca ne vaut pas forcément le coup, si on ne veut pas des performances temps réels, et encore tout dépend de la structure qui sert de clé.

    En plus, il y a même pas besoin de fournir un opérateur de comparaison pour un pointeur.

  13. #13
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    HanLee >> J'avoue ne pas avoir compris ton message (comme quoi, les vacances ca fatigue ! )
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  14. #14
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    HanLee >> J'avoue ne pas avoir compris ton message (comme quoi, les vacances ca fatigue ! )
    Ben, std::tr1::unordered_map, c'est une table de hachage.

    Ca permet d'avoir en pratique un accès en O(1) à un élément à partir d'une clé.

    Ca fait la même chose que std::map, mais avec des complexités différentes, et moi je dis que ça ne vaut pas toujours le coup de passer à une table de hachage, d'autant plus que TR1 n'est pas disponible partout, ni même dans boost, pour le moment.

  15. #15
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Citation Envoyé par HanLee Voir le message
    Ben, std::tr1::unordered_map, c'est une table de hachage.

    Ca permet d'avoir en pratique un accès en O(1) à un élément à partir d'une clé.
    Ouaip.

    Citation Envoyé par HanLee Voir le message
    Ca fait la même chose que std::map, mais avec des complexités différentes, et moi je dis que ça ne vaut pas toujours le coup de passer à une table de hachage,
    C'est une position qui se tient.

    Citation Envoyé par HanLee Voir le message
    d'autant plus que TR1 n'est pas disponible partout, ni même dans boost, pour le moment.
    Faux: Les compilos 'courrants' (g++ et visual) supportent le tr1 et boost l'implémente aussi (http://www.boost.org/doc/libs/1_35_0...boost_tr1.html). Donc pour moi tr1 est dispo partout.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  16. #16
    Membre émérite Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 38
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Par défaut
    Citation Envoyé par Davidbrcz Voir le message
    Faux: Les compilos 'courrants' (g++ et visual) supportent le tr1 et boost l'implémente aussi (http://www.boost.org/doc/libs/1_35_0...boost_tr1.html). Donc pour moi tr1 est dispo partout.
    Les compilos courant comme Visual C++ 2008, mais tout le monde ne l'a pas au travail. Bon OK, il est peut-être pas au travail .
    g++ pour Linux, no problem.
    Pour windows, la version 4 est toujours en alpha, ça peut rebuter.

    Et justement tu t'es fait piéger, boost n'implémente pas en entier TR1.

    C'est pas grave tu me diras, mais justement, <unordered_map> et <unordered_set> ne sont pas implémentés dans boost, comme par hasard !

  17. #17
    Rédacteur

    Avatar de Davidbrcz
    Homme Profil pro
    Ing Supaéro - Doctorant ONERA
    Inscrit en
    Juin 2006
    Messages
    2 307
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 33
    Localisation : Suisse

    Informations professionnelles :
    Activité : Ing Supaéro - Doctorant ONERA

    Informations forums :
    Inscription : Juin 2006
    Messages : 2 307
    Par défaut
    Et justement tu t'es fait piéger, boost n'implémente pas en entier TR1.

    C'est pas grave tu me diras, mais justement, <unordered_map> et <unordered_set> ne sont pas implémentés dans boost, comme par hasard !
    ><. Ta'raison, i've been pwned !
    Je me suis arrété à la vue de <unordered_XXX>, me disant que c'était bon, mais non.
    "Never use brute force in fighting an exponential." (Andrei Alexandrescu)

    Mes articles dont Conseils divers sur le C++
    Une très bonne doc sur le C++ (en) Why linux is better (fr)

  18. #18
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Bon, la question que je vous ai soumise s'est pas la force des choses révélée caduque. C'était pour créer un ensemble de données transitoire (j'expliquais en parenthèses ce que je comptais en faire). Finalement, je m'en suis passé, et ai directement rentré les données dans l'ensemble de données final.

    Mais tout ça n'aura pas été vain, car ça m'a permis de remettre le nez dans TR1 et Boost. J'ai d'ailleurs pioché dedans pour chopper le contenant tuple, qui s'est révélé utile dans ce que j'étais en train de faire. J'ai même commandé un bouquin sur la STL, car je me suis rendu compte que j'étais encore faible sur le sujet.

    Quant à ceux qui disent que TR1 est dispo dans Visual, c'est uniquement vrai pour Visual 2008 en version anglaise. Et j'utilise la française...

    Merci à tous, en tout cas !

  19. #19
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 51
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Par défaut
    Ca a a priori changé depuis hier...

    http://blog.developpez.com/broux?tit...sp1_disponible

    Le SP1 inclus normalement le TR1, et existe en français. Je n'ai pas encore testé.
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  20. #20
    Membre éprouvé
    Profil pro
    Inscrit en
    Novembre 2004
    Messages
    2 766
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2004
    Messages : 2 766
    Par défaut
    Au moment même où je finissais de coder mon truc...

    De toute façon, je me suis aperçu que ma version de Visual C++ était la 2005.

    Pour la version française, c'est ici :
    http://www.microsoft.com/downloads/d...DisplayLang=fr

    Pour les release notes, c'est là (car ce n'est pas évident de trouver mention de la TR1) :
    http://support.microsoft.com/kb/945140/fr

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. LIKE et opérateurs de comparaison
    Par celeamas dans le forum Requêtes
    Réponses: 2
    Dernier message: 23/10/2006, 14h01
  2. Pb avec l'opérateur de comparaison IN
    Par petitnuage dans le forum Requêtes
    Réponses: 2
    Dernier message: 06/06/2006, 16h13
  3. [debutant] map et opérateur '<'
    Par Merfolk dans le forum Débuter
    Réponses: 1
    Dernier message: 29/12/2005, 11h52
  4. implémentation des opérateurs de comparaison
    Par niko8181 dans le forum Algorithmes et structures de données
    Réponses: 5
    Dernier message: 28/04/2005, 11h58
  5. Réponses: 15
    Dernier message: 25/01/2005, 16h51

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo