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 :

structure de donnee et acces rapide à un element


Sujet :

C++

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Octobre 2004
    Messages
    114
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Octobre 2004
    Messages : 114
    Points : 56
    Points
    56
    Par défaut structure de donnee et acces rapide à un element
    Bonjour,

    je dois stocker des informations concernant des fichiers sur une carte à puce. En gros à chaque identifiant fichier je dois associer deux ou trois paramètres.
    Par exemple


    typedef struct
    {
    int nFileID;
    int nKey;
    int nMode;
    } TRecInfo;



    pour le fichier 0x17 on doit utiliser la clé 0x12 pour lire et utiliser un mode spécifique.

    Mon problème est de stocker ces données qui ne dépassent pas un 20n d'éléments puis ensuite de pouvoir récupérer ces données en fournissant l'identifiant fichier: GetRecInfo(0x17) doit me renvoyer les données associées

    Que dois-je utiliser ? un tableau de structure, un std::map, un
    std::set.
    Je veux pouvoir accéder aux données le plus rapidement possible et c'est pour ca que le tableau de structure me paraissait pas mal avec un truc du genre :



    TRecInfo recInfo;

    recInfo.nKey = 0x12;
    recInfo.nMode = 0
    m_RecInfo[0x17] = recInfo;

    Si je choisis cette solution il n'y a pas une façon plus élégantge d'initialiser ce tableau du genre ?

    m_RecInfo[0x17] = new TRecInfo(0x12, 0);

  2. #2
    Expert éminent sénior
    Avatar de Luc Hermitte
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2003
    Messages
    5 275
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Août 2003
    Messages : 5 275
    Points : 10 985
    Points
    10 985
    Par défaut
    Combien d'entrées veux-tu ? Seulement une vingtaine ? Alors un vecteur maintenu trié suffit amplement. On peut alors faire une recherche en O(ln n) avec std::binary_search.
    Voire même consommer plus de mémoire que nécessaire afin d'avoir un tableau à trous et d'assurer un accès en O(1). A condition que les index aient un max raisonnable. Dans le genre, il y a les tables de hashage non encore standard.

    std::set et std::map assurent des accès en O(ln n). Pour la map, l'index est externe à la donnée stockée.
    L'avantage sur les vecteurs étant si il y a beaucoup d'ajouts et retraits. Sinon, cela consomme un petit peu plus de mémoire qu'un vecteur calé au minimum, et le parcours itératif est un chouilla plus lent.

    Enfin. Si tu veux un multi indexage (avec toutes les recherches "rapides"), boost.multi_index est une solution (non encore personnellement testée).

    PS: le typedef sur les structures est superflu en C++.
    PPS: pour trois entiers, faire des news n'est pas forcément utile. Cela demande beaucoup plus d'attention, et je ne suis pas persuadé qu'il y aurait des gains observables. Maintenant, la modélisation du problème peut parfaitement justifier ce choix -- genre si une structure doit être partagée.
    Blog|FAQ C++|FAQ fclc++|FAQ Comeau|FAQ C++lite|FAQ BS|Bons livres sur le C++
    Les MP ne sont pas une hotline. Je ne réponds à aucune question technique par le biais de ce média. Et de toutes façons, ma BAL sur dvpz est pleine...

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Avril 2005
    Messages
    41
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2005
    Messages : 41
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par Luc Hermitte
    genre si une structure doit être partagée.
    qu'entend tu par là ?

    Il se trouve que j'ai un programme qui fonctionne avec des structures pour effectuer une communication entre différentes parties de la modélisation.
    Or pour passer mes structures d'une classe à une autre, je les alloue dynamiquement avec new pour être sûr que les données ne seront détruites que lorsque j'aurais terminé de les utilisées. Est-ce une bonne méthode ? y'en a-t-il une autre pour s'assurer que des données ne soient pas détruites par la fin d'un bloc ???

    exemple de ce que je fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    mon_type_de_struct * ma_struct = new mon_type_de_struct;
    // remplissage de données
    maClasse.setStruct( ma_struct );
    return;
     
    // dans maClasse :
    void setStruct( mon_type_de_struct * ma_struct )
    {
      m_structure = ma_struct;
      // stockage pour une utilisation future, lors de l'appel d'un draw par
      // exemple.
    }

Discussions similaires

  1. base de donnee gratuit et rapide
    Par arigon dans le forum Décisions SGBD
    Réponses: 1
    Dernier message: 20/08/2006, 18h50
  2. Structure de données pour recherche rapide
    Par socrate dans le forum C
    Réponses: 1
    Dernier message: 18/06/2006, 14h49
  3. [POO] Les structures de données comme en C++...
    Par FrankOVD dans le forum Langage
    Réponses: 3
    Dernier message: 27/04/2006, 19h44
  4. Structure FIFO optimisée à l'accès
    Par guipom dans le forum Langage SQL
    Réponses: 5
    Dernier message: 03/11/2005, 09h56
  5. Accés rapide aux propriétés d'un Objet
    Par Alacazam dans le forum C++Builder
    Réponses: 4
    Dernier message: 28/11/2002, 21h56

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