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

C++ Discussion :

Le point sur unordered_map


Sujet :

C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Par défaut Le point sur unordered_map
    Salut Amis développeurs
    J'ai découvert il y a pas longtemps l'existence du conteneur std::unordered_map avec msvc 2010.
    D'après ce que j'ai lu ce conteneur est plus efficace que la std::map pour tout ce qui est find, insert, erase.....Mais par contre il faut fournir une fonction de hachage qui tient la route..Aussi il y en a qui sont fournies par défaut....
    Moi je veux faire ça : std::unordered_map<std::pair<int,int>, float>.....
    Donc la question est : est-ce que j'ai une fonction de hachage appropriée pour
    les std::pair...ou faut-il la fournir....En gros quel condition doit-remplir un type pour être clé d'une unordered_map....
    N.B : Je suis en plein dans un projet donc j'ai pas trop le temps de chercher en profondeur...Merci de me filer un coup de main .

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Par défaut
    Je me repond moi-meme car j'ai trouvé.....
    Pour ceux qui ont le meme probleme sachez que boost fournit dans son header
    boost/functional/hash/extensions.hpp des fonctions de hach pour std::pair<> et tous les conteneurs.

    Attendez...c'est pas encore fini...J'ai un autre petit problème
    Je veux modifier une clé dans mon unordered_map par itérateur mais apparemment c'est protégé car quand j'essaie-->erreur de compilation...

    Je ne maitrise pas encore ce conteneur mais je sais que avec map il peut y avoir des soucis car c'est ordonné en permanence...mais là il n'y a pas d'ordre...

    Alors Est-ce que quelqu'un sait comme procéder pour modifier les valeurs des clés tout en gardant la meme position...???
    Merci

  3. #3
    Invité
    Invité(e)
    Par défaut
    Le nom est trompeur... Les unordered_map sont aussi ordonnées, mais pas selon des critères que tu definis toi-même. Logiquement tu ne peux pas modifier la clé.

  4. #4
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Par défaut
    Salut,
    ordonnée ou pas, une map est une association entre une clé et une valeur. Modifier la clé revient à supprimer une ancienne association pour en créer une nouvelle.
    L'idée sous jascente des map (ordered) est d'utiliser la relation d'ordre strict pour construire un arbre binaire des éléments et permettre leur recherche en log(n). L'inconvénient est que l'insertion ou la suppression d'un élément est couteuse car cela demande de retravailler sur l'arbre.
    L'idée des unordered map est d'utiliser une fonction de hachage pour segmenter l'ensemble des clés en différents sous-ensembles plus réduits (un peu comme les CMap des MFC), l'association dans le sous-ensemble étant gérée plus 'basiquement' (les MFC font une liste chaînée si je me souvient bien). Le principe est d'avoir une fonction de hachage qui minimise les collisions, çad qui minimise le nombre de clés qui ont le même hash. L'insertion et la suppression peuvent être alors plus rapide (comme dans une liste chaînée par expl) mais la recherche est un peu moins performante.

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Février 2010
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2010
    Messages : 60
    Par défaut
    L'insertion et la suppression peuvent être alors plus rapide (comme dans une liste chaînée par expl) mais la recherche est un peu moins performante.
    Qu'entends-tu par moins performante ??? car selon ce que j'ai lu les unordered_map sont plus rapides que les map que ce soit pour l'insertion, la suppression mais aussi pour la recherche....

  6. #6
    Membre éprouvé
    Avatar de ymoreau
    Homme Profil pro
    Ingénieur étude et développement
    Inscrit en
    Septembre 2005
    Messages
    1 154
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Ingénieur étude et développement
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 1 154
    Par défaut
    Salut, voici les infos sur les conteneurs de Qt : http://qt.developpez.com/doc/latest/...mic-complexity

    A savoir que QHash correspond au std::unordered_map et QMap au std::map. Même s'il ne s'agit pas exactement de la même implémentation, les algos sont les mêmes derrière, donc la complexité aussi. Pour résumer l'unordored_map sera plus rapide en moyenne pour n'importe quelle action (insertion, suppression, recherche), par contre le pire (lorsque la fonction de hachage crée beaucoup de collisions) est plus important qu'avec une map (en arbre).

  7. #7
    screetch
    Invité(e)
    Par défaut
    il faut savoir que les unordered_map ont un gros defaut: lorsqu'on depasse une certqine taille (qui double a chaque fois) l'ensemble va etre realloué, toute les clés de hachage vont etre recalculées (ca depend de l'implementation bien sur mais la derniere fois que j'avais essayé sur crosof c'etait comme ca) et donc la performance a l'insertion chute

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/02/2005, 18h04
  2. identifier un point sur l'ecran
    Par alionel dans le forum MFC
    Réponses: 2
    Dernier message: 25/02/2005, 16h12
  3. calcul d'un point sur la base d'un cone
    Par Admin dans le forum Algorithmes et structures de données
    Réponses: 4
    Dernier message: 18/11/2003, 21h18

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