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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  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 : 40
    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
    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.

  9. #9
    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)

  10. #10
    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.

+ 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