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

Langage C++ Discussion :

conteneur map avec des valeurs structurées


Sujet :

Langage C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Février 2011
    Messages
    3
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Février 2011
    Messages : 3
    Points : 4
    Points
    4
    Par défaut conteneur map avec des valeurs structurées
    Bonjour,

    Je cherche à stocker des éléments de type S, une structure organisée selon le schéma suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    typedef struct
    {
        A;
        B;
    } S;
    où A est un type simple (p. ex. int) et B une structure.

    Ma map est définie de la manière ci-après :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    map<int, S> mySMap;
    Pour une raison particulière, je souhaiterais, en utilisant la clé '1' par exemple, pouvoir donner une valeur à A, indépendamment de S', et réciproquement.

    Je pensais pouvoir m'en sortir simplement en exécutant ce type d'instruction :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    mySMap[1].A = ...;
    mySMap[1].B.val1 = ...;
    ,
    mais cela n'a pas marché à l'exécution.

    J'ai vu quelques exemples sur la toile, mais pas vraiment comparable à ce que je cherche à faire.

    Comment procéder dans mon cas ? Quelqu'un a une idée ?
    Merci par avance.

  2. #2
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Salut,

    Pour commencer, une petite précision "syntaxique"... : le typedef n'est pas nécessaire pour struct ni pour class en C++ : la définition d'une classe (ou d'une structure, car il n'y a pour ainsi dire pas de différence) déclare automatiquement le type du nom donné...

    Ensuite, il faut prendre conscience du fait qu'une structure a pour principale objectif de créer des objets "atomiques", c'est à dire que, lorsque tu obtiens une instance de ta structure, tu te dois de prendre en compte (du moins dans ton développement) l'ensemble du contenu de l'instance, à savoir : y a-t-il réellement un sens à permettre de modifier A sans modifier B Est-ce que le seul fait de modifier A ne te fais pas te retrouver avec... une instance totalement différente de ta structure

    Je vais prendre un exemple clair pour te faire comprendre... :
    Imaginon que ta structure soit nommée Personne, que A soit le prénom et que B soit le prénom.

    Si tu permet de modifier le prénom de Albert Einchtein, tu obtiendras un autre Einchtein, mais pas le fameux physicien que tout le monde connait

    De même, si tu permet de modifier le nom de famille, tu obtiendra un illustre inconnu qui s'appelle Albert, mais ce ne sera, là non plus, pas le fameux physicien (re )

    Enfin, il me semble très utile de préciser qu'il est vraiment conseillé de se méfier énormément de l'opérateur [ ] avec les maps...:

    En effet, si l'identifiant est trouvé, nous travaillerons effectivement avec... l'élément correspondant, mais, si par contre l'identifiant n'est pas trouvé, nous travaillerons avec... un nouvel élément créé pour l'occasion

    La meilleure solution, surtout si tu souhaites modifier les éléments sans en changer la clé, et donc, pour autant que cela ait un sens de permettre cette modification, est donc de passer par les itérateurs non constant, sous une forme proche de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    /* soit laMap étant la std::map<int, S> qui contient les éléments */
    std::map<int, S>::iterator it = laMap.find(id_a_trouver);
    /* une petite vérification de l'existence de l'élément  */
    if(it!=laMap.end())
    {
          it->second.a = blabla ;
    }

  3. #3
    Membre confirmé
    Homme Profil pro
    Étudiant
    Inscrit en
    Novembre 2010
    Messages
    254
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Novembre 2010
    Messages : 254
    Points : 538
    Points
    538
    Par défaut
    Ne serait-il pas plus simple de faire un tableau de structure, plutot qu'une map?

  4. #4
    Expert éminent sénior
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 52
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 629
    Points : 30 692
    Points
    30 692
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Ne serait-il pas plus simple de faire un tableau de structure, plutot qu'une map?
    Pas forcément...

    Chaque type de collection a des avantages et des inconvénients qui les rendent préférables dans certaines situations... Et exécrables dans d'autres...

    Ainsi, les tableaux rendent les accès très rapides si... on sait à quel indice on souhaite accéder, ou si les éléments sont triés (on peut alors utiliser la dichotomie pour la recherche d'un élément), mais cela implique... qu'il soit possible (et cohérent ) de (pouvoir) comparer les éléments entres eux, pour trier le tableau.

    De leurs coté, les map utilisent également la dichotomie pour la recherche, mais on a la certitude qu'il est possible de comparer la clé (c'est un prérequis !!!) et, mieux encore, que les éléments sont en permanence triés

    De plus, les tableaux présentent (peut être) l'énorme inconvénients de regrouper l'ensemble de manière contigüe en mémoire...

    Bref, pour te donner une idée précise de ce qui est le mieux dans une situation donnée, tu devrais faire un tour du coté de cette réponse de la FAQ

  5. #5
    Expert confirmé

    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2007
    Messages
    1 895
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 48
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Septembre 2007
    Messages : 1 895
    Points : 4 551
    Points
    4 551
    Par défaut
    Citation Envoyé par 6-MarViN Voir le message
    Ne serait-il pas plus simple de faire un tableau de structure, plutot qu'une map?
    Un tableau n'a d'intérêt que si l'ensemble est borné, avec les bornes min et max connues et proches (pour limiter le nombre d'éléments), et dense (c'est à dire avec un nombre de "tour" relativement faible).

    Une map permet de s'affranchir de ces limitations, et permet donc de stocker de manière efficace des ensembles peu dense ainsi que des ensembles non bornés ou avec une différence borne max - borne min trop importante pour justifier l'utilisation d'un tableau. Par exemple, stocker des informations en fonction d'un timestamp stocké sur 64 bits avec une unité de temps d'une nanoseconde.

    Du coup, avec un seul exemple donné par l'OP, il est très difficile de répondre à ta question

Discussions similaires

  1. Une map avec des clefs à plusieurs valeurs
    Par jasmin59000 dans le forum Collection et Stream
    Réponses: 3
    Dernier message: 12/08/2011, 11h39
  2. [Débutant] Liste avec des valeurs associées aux string
    Par Bouillou dans le forum C++Builder
    Réponses: 3
    Dernier message: 16/03/2006, 18h11
  3. Trier une colonne avec des valeurs numériques ou textes
    Par jfc dans le forum MS SQL Server
    Réponses: 3
    Dernier message: 07/02/2006, 11h15
  4. Problème de "select" avec des valeurs a null
    Par SchpatziBreizh dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 01/07/2005, 16h08
  5. Réponses: 6
    Dernier message: 04/04/2003, 15h28

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