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++Builder Discussion :

comment utiliser le map (stl pour faire un tableau associatif)


Sujet :

C++Builder

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Points : 6
    Points
    6
    Par défaut comment utiliser le map (stl pour faire un tableau associatif)
    Bonjour
    je souhaite utiliser des tableau associatif sous c++ builder 6.
    j'ai trouvé les fonctions de STL : map
    mais cela ne semble compatible avec c++ builder (il semble ne pas gerer les 'member templates')
    - quelqu'un connais t'il un moyen d'utiliser les map ?
    - ou une autre méthode pour des tableau associatif compatible avec c++ builder ?
    cela fonctionne t'il sous des version plus récente de c++ builder ?

  2. #2
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    A chaque fois que je viens poser une question le fait d'exprimer un bloqiquage m'aide mettre à mieux comprendre le problême. et a trouver des pistes.

    Exemple :
    j'ai testé avec une TStringList qui permet 'quasiment' d'acceder a des donnés par clef, on n'est pas très loin du tableau associatif

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    TStringList *lis = new    TStringList() ;
    lis->Add("333") ;
    lis->Add("44") ;
    lis->Add("5") ;
    Memo1->Lines->Append(lis->IndexOf("44") );
    je continue à explorer cette piste,
    si quelqu'un en un une autre elle m'interressent tout de même.

  3. #3
    Membre actif
    Profil pro
    Inscrit en
    Juin 2006
    Messages
    385
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2006
    Messages : 385
    Points : 288
    Points
    288
    Par défaut
    salut,

    j'avoue que j'ai pas trop compris ce que tu veux faire,
    cependant:

    si tu accedes à tes données via une seul clé, la solution des StringList parait juste avec la fonction( Indexof(clé));

    sinon,
    pour deux clés ou plus tu peux utiliser les INIFile, il y a pas male de post ici qui ont traité ce sujet.

    A+
    « Aucun homme ne peut rien vous révéler sinon ce qui repose déjà à demi endormi dans l'aube de votre connaissance»

    « No man can reveal to you aught but that which already lies half asleep in the dawning of your knowledge »_(¯`·.__-Alg3ri4nH4ck3r-__.·´¯)_

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Bonjour, merci pour l'info

    Je travaille régulièrement sur de la fouille textuelle.
    les tableau associatif (aussi appelé dictionnaire ou table d'association) ref : http://fr.wikipedia.org/wiki/Tableau_associatif
    sont des structure de donné super puissante, il permette de créer tres rapidement et très facilement différent algo.
    les Inifile (c.a.d Fichier INI ?), j'ai l'impression que cela n'est pas suffisant pour mon cas, les donnés sont défini avant l'exécution et ne peuvent pas être généré dynamiquement a l'exécution !

  5. #5
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nifrou Voir le message
    Bonjour
    je souhaite utiliser des tableau associatif sous c++ builder 6.
    j'ai trouvé les fonctions de STL : map
    mais cela ne semble compatible avec c++ builder (il semble ne pas gerer les 'member templates')
    - quelqu'un connais t'il un moyen d'utiliser les map ?
    - ou une autre méthode pour des tableau associatif compatible avec c++ builder ?
    cela fonctionne t'il sous des version plus récente de c++ builder ?
    Les map fonctionnents sous C++ Builder 6, j'en utilise souvent...

    Pour y accéder tu dois faire qqchose comme

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    #include <map>
     
    using namespace std;
     
    // dans ta fonction
    map<String, int> ma_map;
    ma_map.insert(make_pair(String("un"),1));
    ma_map.insert(make_pair(String("deux"),2));
    ma_map["trois"]=3;
     
    int val=ma_map[String("deux")];
    des choses comme ca quoi (je mets les constructeurs de String pour clarifier, en pratique, Builder se débrouille pour faire les casts si tu ne les indique pas).

    Francois

  6. #6
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    Merci beaucoup François pour ces expliquations + le code
    Je teste cela.
    Sinon dans le coup les TStringList on bien fais l'affaire, elle dispos de pas mal de fonction de tri, etc..
    grace a toi Je pourais facilement a faire des chose plus complexes en fouille et traitement de texte

  7. #7
    Futur Membre du Club
    Profil pro
    Inscrit en
    Août 2005
    Messages
    11
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2005
    Messages : 11
    Points : 6
    Points
    6
    Par défaut
    ça marche super bien merci
    Il fallait indiquer les paramètres d'instanciation comme cela : map<String, int>
    Il aurait mieux fallut que je j'apprenne le fonctionnement des templates avant d'en utiliser
    ...je viens de réparer la chose. (woaw super efficace les templates, le C++ m'étonneras toujours )
    c'est bien tu m'a même fournis un exemple complet pas la peine de chercher la méthode d'acces et fonctions de base.

  8. #8
    Membre averti

    Profil pro
    Inscrit en
    Juin 2005
    Messages
    351
    Détails du profil
    Informations personnelles :
    Localisation : Suisse

    Informations forums :
    Inscription : Juin 2005
    Messages : 351
    Points : 446
    Points
    446
    Par défaut
    oui, les map sont très utiles :-)

    Un petit truc qui m'a posé des soucis:

    Si tu cherches une valeur pour une association qui n'existe pas, le map va créer une entrée. Par exemple si tu fais:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int val=ma_map[String("cent")];
    Alors que tu n'as jamais fait de

    le map crée une nouvelle entrée avec une valeur par défaut ce qui risque de te retourner des valeurs erronées.

    Il y a donc une fonction pour rechercher la pair directement dans le map:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    map<String,int>::iterator pointer=ma_map.find("cent");
    Cette fonction retourne un pointeur sur un pair<String,int> et, si aucune paire n'a été trouvée, alors ce pointeur vaut "ma_map.end()".

    Tu peux donc t'assurer qu'une valeur existe dans la map avec le code suivant:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    map<String,int>::iterator pointer=ma_map.find("cent");
    if (pointer==ma_map.end()) {
      // Erreur: "cent" n'a pas encore été enregistré
    }
    int val=pointer->second;   // Retourne le second terme de la pair, càd la valeur
    int val2=ma_map["cent"];  // Même résultat mais moins performant puisqu'il faut à nouveau parcourir la map à la recherche de la clé
    Voilà, c'est le point un peu faible des map à mon avis: impossible de savoir facilement si une clé a déjà été enregistrée ou non.

    PS: Il y a aussi un map<String,int>::const_iterator utile si tu travailles dans une fonction qui garanti que la map est const

  9. #9
    Invité
    Invité(e)
    Par défaut
    Citation Envoyé par nifrou Voir le message
    Sinon dans le coup les TStringList on bien fais l'affaire, elle dispos de pas mal de fonction de tri, etc..
    Oui, les StringList, ou les TStrings, d'ailleurs, c'est très pratique. Mais ca sert à autre chose... Une map, ca va surtout servir pour de gros volumes de données, quand on veut rechercher. Pour cela, une TStringList et IndexOf vont être lents.

    Une TStringList, c'est ce qui se fait de mieux pour de petites listes de texte et d'objets, car c'est un format de base de la vcl. Du coup, on peut très facilement les lire et les écrire (LoadFromFile, SaveToFile) ou les afficher dans un objet d'interface (presque toutes les listes ont un TStrings comme Item...)

    Francois

Discussions similaires

  1. [WebForms]Comment utiliser la touche entrée pour valider un formulaire ?
    Par yonialhadeff dans le forum Général Dotnet
    Réponses: 3
    Dernier message: 10/05/2006, 12h29
  2. Réponses: 3
    Dernier message: 04/05/2006, 17h15
  3. Réponses: 1
    Dernier message: 21/02/2006, 17h13
  4. Comment utiliser la meme table pour plusieurs formulaires
    Par pacodelareunion dans le forum Access
    Réponses: 5
    Dernier message: 26/10/2005, 15h17
  5. Comment utiliser une icône personnalisée pour un composant ?
    Par Bruno75 dans le forum Composants VCL
    Réponses: 2
    Dernier message: 22/09/2005, 17h24

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