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
    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 �m�rite

    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
    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
    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 �m�rite

    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
    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
    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