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 :

Problème std::set avec une structure


Sujet :

C++

  1. #1
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Par défaut Problème std::set avec une structure
    Bonjour à tous,

    j'ai actuellement un petit problème avec la librairie STL, concernant la classe std::set.

    Je veux créer un ensemble de structures, dont l'ordre est donné par un élément de la structure.
    Je pense que mon code sera plus parlant :

    Voila la définition de la structure en question, avec la fonction de comparaison qui compare uniquement le champ 'etiq'.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    typedef struct{
    	int etiq;
    	set<string> identites;
    }hash_table;
     
    struct H_Compare     // fonction de comparaison des table de hachage par rapport à l'etiquette
    {
    	bool operator()(hash_table H1, hash_table H2)
    	{
    		return H1.etiq - H2.etiq;
    	}
    };
    Ce que je veux c'est : a chaque fois que je rencontre une etiquette 'etiq', je veux pouvoir vérifier que si elle est déjà dans une des structures présentes dans l'ensemble.

    Dans le cas ou l'etiquette existe, je dois modifier le champ 'identities' correspondant à cette structure dans l'ensemble.

    Dans le cas contraire, je dois ajouter à cette ensemble une nouvelle structure contenant l'étiquette rencontrée.

    J'espère que je m'exprime assez clairement...

    Voila ce que j'ai écrit pour l'instant.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
     
    hash_table Hash;
    set<hash_table, H_Compare> DB;
     
    string str;                                         // éléments à insérer dans le champ 'identities'
    strncpy(tmp, file_cur->d_name, 7);
    tmp[7] = '\0';
    str.assign(tmp);
     
    if(DB.find(etiq) == DB.end())  //si l'etiquette n'existe pas
    {
    	Hash.etiq = etiq;
    	(Hash.identites).insert(str);
    	DB.insert(Hash);
     
    }
    Mais je vous avouerais que j'ai un doute énorme sur le bon fonctionnement de ce que j'ai écrit, sans oublier que je ne vois pas comment faire lorsque l'étiquette est trouvée...

    Merci de l'aide pour vous pourrez m'apporter

  2. #2
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Par défaut la suite...
    A première vue, le problème vient du
    Le bon sens me pousse à croire que c'est pas comme ca qu'on peut rechercher une étiquette... Mais le problème, c'est que je vois pas comment !!

    De l'aide SVP, j'en ai besoin...

    Merci

  3. #3
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Par défaut
    Bon j'ai trouvé la solution...
    Ca faisait plus de 3 jours que j'étais sur ce programme, et à chaque fois un problème différent...

    Enfin bref,
    voila le code parce que ca peut toujours servir à quelqu'un

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    typedef struct{
    	int etiq;
    	set<string> identites;
    }hash_table;
    
    struct H_Compare     // fonction de comparaison des table de hachage par rapport à l'etiquette
    {
    	bool operator()(hash_table H1, hash_table H2)
    	{
    		return (H1.etiq < H2.etiq);
    	}
    };
    
    
    
    
    
    hash_table Hash;
    set<hash_table, H_Compare> DB;
     
    string str;                                         // éléments à insérer dans le champ 'identities'
    strncpy(tmp, file_cur->d_name, 7);
    tmp[7] = '\0';
    str.assign(tmp);
    
    Hash.etiq = etiq;
    (Hash.identites).insert(str);
    
    set<hash_table, H_Compare>::iterator H_it;
    H_it = DB.find(Hash);
     
    if(H_it == DB.end())  //si l'etiquette n'existe pas
    {
    	DB.insert(Hash);	
    }else{
    	((*H_it).identities).insert(str);
    }

  4. #4
    Inactif  


    Homme Profil pro
    Inscrit en
    Novembre 2008
    Messages
    5 288
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Secteur : Santé

    Informations forums :
    Inscription : Novembre 2008
    Messages : 5 288
    Par défaut
    Bonjour DeathMixer

    Je ne comprend pas très bien ce que tu veux faire...
    A priori, tu veux gérer plusieurs étiquettes (des entiers), chacune étant liée à plusieurs string. Ca serait pas plus simple en utilisant std::multimap ?

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    int etiq = 10;
    string str = "test";
     
    // création
    typedef multimap<int, string> MyDbType;
    typedef MyDbType::iterator MyDbIterator;
    typedef pair<MyDbIterator, MyDbIterator> MyDbReturn;
     
    MyDbType DB;
     
    // insérer une nouvelle étiquette
    DB.insert ( pair<int, string> (etiq, str) );
     
    // nombre d'élements contenant l'étiquette etiq
    int nb_elem = DB.count(etiq);
     
    // lister l'ensemble des identités pour une étiquette donnée
    MyDbReturn ret = mymm.equal_range(etiq);
    for(MyDbIterator it=ret.first; it!=ret.second; ++it)
    {
      int etiq_result = it->first;
      string str_result = it->second;
    }
    Ca peut peut être t'intéresser.

  5. #5
    Membre éclairé
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    60
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Avril 2009
    Messages : 60
    Par défaut
    Ouais c' est vrai qu'avec multimap, ca fait aussi ce que je veux.
    Mais j'avoue que je me suis lancé dans le C++ avec juste les bases du C, mais pour mes programmes j'avais besoin d'utiliser des ensembles. C'est uniquement pour ca que j'ai transformé l'extension de mon programme en .cpp

    ET le premier élément qui m'est venue en tête pour faire ce que je voulais c'etait la classe std::set. Donc je m'en suis accomodé, et j'ai essayé de trouver un moyen de l'appliquer plus ou moins efficacement avec cette classe.

    Merci en tout cas, je vais étudier de plus près la classe multimap, et voir comment elle fonctionne.

    Merci encore.

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème de Pointeur avec une structure pointée
    Par misterlagaffe dans le forum C
    Réponses: 25
    Dernier message: 03/02/2012, 09h17
  2. Problème avec une structure
    Par titux dans le forum C
    Réponses: 5
    Dernier message: 22/07/2007, 16h26
  3. Problème avec une structure
    Par Pierre.g dans le forum C
    Réponses: 4
    Dernier message: 30/12/2006, 12h22
  4. Problème pour charger un set avec une clé étrangère
    Par sylvainv18 dans le forum Hibernate
    Réponses: 2
    Dernier message: 06/11/2006, 18h08
  5. Probléme avec une structure
    Par astragoth dans le forum C++
    Réponses: 3
    Dernier message: 25/04/2006, 20h31

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