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

Boost C++ Discussion :

std::map shared_ptr en clé et std::vector <shared_ptr> en valeur


Sujet :

Boost C++

  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut std::map shared_ptr en clé et std::vector <shared_ptr> en valeur
    Bonjour tout le monde!

    Je suis face à un problème que je ne m'explique pas: j'ai créé une std::map de la manière suivante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::map<boost::shared_ptr<Band>, std::vector<boost::shared_ptr<Request> >, BandComparator >
    Avec comme structure BandComparator:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct BandComparator
    {
      bool operator()(const Band& band1, const Band& band2) const;
      bool operator()(boost::shared_ptr<Band> band1, boost::shared_ptr<Band> band2) const;
    };
    Lorsque je tente de récupérer une valeur de la façon suivante, j'obtiens une erreur de segmentation:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    const std::vector<boost::shared_ptr<Request> >& BandAndRequestManager::getRequestsFromBand(
        const boost::shared_ptr<Band> &band)
    {
      return m_bandRequestsMap.at(band);
    }
    J'ai vérifié si la surcharge de l'opérateur de comparaison était correcte et aucun problème de ce niveau là.
    De plus le groupe est bien trouvé (j'ai également utilisé la méthode find pour vérifier...)

    Je ne comprends pas d'où mon erreur peut venir.

    Si vous avez des idées, je suis preneur.

    Merci.

    Edit:

    J'ai fait un code minimaliste qui reproduit le même comportement:
    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
    39
    40
    41
    42
    43
    44
    45
    class Object
    {
      double m_d;
      int m_i;
    public:
      Object(): m_d(0.0), m_i(0){};
      ~Object(){};
    };
     
    struct ObjectCompare
    {
      bool operator()(const boost::shared_ptr<Object>& obj1, const boost::shared_ptr<Object>& obj2) const
      {
        return true;
      }
      bool operator()(const Object& obj1, const Object& obj2) const
      {
        return true;
      }
    };
     
    int
    main(int argc, char *argv[])
    {
      std::map<boost::shared_ptr<Object>, std::vector<boost::shared_ptr<Object> >, ObjectCompare> map1;
     
      std::vector<boost::shared_ptr<Object> > vec1;
      vec1.push_back(boost::shared_ptr<Object>(new Object()));
      vec1.push_back(boost::shared_ptr<Object>(new Object()));
      vec1.push_back(boost::shared_ptr<Object>(new Object()));
     
      boost::shared_ptr<Object> object = boost::make_shared<Object>();
     
     
      map1[object] = vec1;
     
     
      std::cout << "vec1.size(): " << vec1.size() << std::endl; //Aucun probleme
      std::cout << "map1.size(): " << map1.size() << std::endl; //Me retourne bien 1.
      std::cout << "map1.count(object): " << map1.count(object) << std::endl; //Me retourne 0... alors que je devrais obtenir 1;
      std::vector<boost::shared_ptr<Object> > vec2 = map1.at(object); //Erreur de segmentation
     
      std::cout << "vec2.size(): " << vec2.size() << std::endl;
      return 0;
    }

  2. #2
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    const std::vector<boost::shared_ptr<Request> >& BandAndRequestManager::getRequestsFromBand(
        const boost::shared_ptr<Band> &band)
    {
      auto it = m_bandRequestsMap.find(band);
      assert (it != m_bandRequestsMap.end());
      return it->second;
    }
    Est-ce que ce code fonctionne ?
    Peut-être que map::find et map::at échouent tous les deux lors de tes tests, mais que find est plus discret dans son échec puisqu'il se contente de renvoyer map::end au lieu d'une exception.

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Non ce code ne fonctionne pas chez moi: it est égal à m_bandRequestsMap.end().

    Je ne comprends vraiment pas puisque la fonction de comparaison retourne bien true donc, je devrais bien avoir la valeur correspondante à cette clé non?

  4. #4
    Membre éprouvé

    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    533
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 533
    Points : 1 086
    Points
    1 086
    Par défaut
    ObjectCompare retourne-t-il toujours true ?
    std::map est un conteneur d'éléments triés, donc ObjectCompare est censé être un équivalent de l'opérateur « < » sur des Object, pour permettre le tri des indices de la map. Est-ce qu'il fonctionne correctement ?

  5. #5
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Avril 2010
    Messages
    517
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Gironde (Aquitaine)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Santé

    Informations forums :
    Inscription : Avril 2010
    Messages : 517
    Points : 718
    Points
    718
    Par défaut
    Effectivement,
    Mon comparateur était un comparateur d'égalité. J'ai remplacé dans mon code par l'opérateur "<" et tout fonctionne.

    Si je comprends bien le fonctionnement de std::map, s'il il n'y a pas égalité lors du test de comparaison, le sens de la recherche s'effectue à droite où à gauche de l'arbre suivant le résultat?

    Encore merci pour tout.

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

Discussions similaires

  1. Accession aux std::map triées ?
    Par Matthieu Brucher dans le forum SL & STL
    Réponses: 5
    Dernier message: 18/11/2005, 14h44
  2. std::map<int,CStringArray> ????
    Par philippe V dans le forum MFC
    Réponses: 1
    Dernier message: 12/10/2005, 06h48
  3. Libérer des pointeurs dans une std::map
    Par GaldorSP dans le forum SL & STL
    Réponses: 2
    Dernier message: 09/07/2005, 14h42
  4. Trier un std::map selon les valeurs plutot que les clés
    Par dj.motte dans le forum SL & STL
    Réponses: 2
    Dernier message: 13/11/2004, 21h54

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