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

SL & STL C++ Discussion :

set<Pointeur*> mal trié


Sujet :

SL & STL C++

  1. #1
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Points : 49
    Points
    49
    Par défaut set<Pointeur*> mal trié
    Bonjour, je suis sur un projet ou je manipule une grande quantité d'objet sous forme de pointeurs.
    J'aimerai donc stocker ces objets de manière triés pour pouvoir avoir une recherche rapide.
    J'utilise donc le conteneur std::set que je déclare de cette manière :
    J'ai surchargé l'opérateur < :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool operator< (const Pointeur &a, const Pointeur &b);
    Malheuresement, lorsque je parcours mon set je me rend compte que les pointeurs ne sont pas triés en fonction de la valeur de mes objets mais en fonction de la valeur de l'adresse du pointeur.

    Quels sont les solutions pour obtenir une liste triée en fonction de la valeur des items et non pas en fonction de la valeur des adresses des pointeurs ?

    Merci d'avance.

  2. #2
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Pour rappel:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    template < class Key, class Compare = less<Key>,
               class Allocator = allocator<Key> > class set;
    A toi de lui fournir une classe Compare qui parte de Pointeur*.

  3. #3
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    ok je teste ça.
    Si tu as un lien d'exemple d'implémentation sur internet, c'est bien venu.

    Merci beaucoup.

  4. #4
    Expert confirmé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Décembre 2003
    Messages
    3 549
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

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

    Informations forums :
    Inscription : Décembre 2003
    Messages : 3 549
    Points : 4 625
    Points
    4 625
    Par défaut
    Puis-je savoir pourquoi tu utilises des pointeurs ?
    Boost ftw

  5. #5
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    je suis en train de prog une structure VEF : vertex edge face pour pouvoir travailler sur un maillage 3D.

    J'utilise des pointeurs car je créer par exemple un Vertex et que ensuite je fais avoir des liens vers ce vertex depuis mes edges et mes faces. Mes edges auront un lien vers ses vertex et ces faces. Les faces auront un lien vers leurs edges et leurs vertex.

  6. #6
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Je comprend pas trop comment je dois implémenter ça.

    En fait je dois faire quoi je dois dériver Pointeur* pour obtenir un classe ou je surcharge l'opérateur < ?

  7. #7
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    Après un peu de recherche j'en suis la :

    vertex.hpp :
    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
     
    #ifndef VERTEX_HPP
    #define VERTEX_HPP
     
    class Vertex {
     
    public:
      // Constructeur
      Vertex (double x, double y, double z);
      // Accesseur
      const double &x() const;
      const double &y() const;
      const double &z() const;
     
    private:
      double _x, _y, _z;
    };
     
    //Opérateur de comparaison
    bool operator== (Vertex &a, Vertex &b);
    bool operator!= (Vertex &a, Vertex &b);
    bool operator>= (Vertex &a, Vertex &b);
    bool operator<= (Vertex &a, Vertex &b);
    bool operator>  (Vertex &a, Vertex &b);
    bool operator<  (Vertex &a, Vertex &b);
     
    #endif /* VERTEX_HPP */
    foncteur_vertex.hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    #ifndef FONCTEUR_VERTEX_HPP
    #define FONCTEUR_VERTEX_HPP
     
    #include "vertex.hpp"
     
    class FoncteurVertex {
    public:
      bool operator() (const Vertex *a, const Vertex *b) const;
    };
     
    #endif /* FONCTEUR_VERTEX_HPP */
    main.cpp
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set<Vertex*, FoncteurVertex> _vertex;
    Mais voila j'ai un problème à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    erreur: invalid initialization of reference of type ‘const std::set<Vertex*, std::less<Vertex*>, std::allocator<Vertex*> >&’ from expression of type ‘const std::set<Vertex*, FoncteurVertex, std::allocator<Vertex*> >’
    Je comprend pas trop les foncteur c'est tout nouveau pour moi et je trouve plus trop de docmuentation sur internet.

    Merci d'avance.

  8. #8
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    j'ai pas le temps de l'implémenter dans la matinée mais cet aprem ou ce soir je tente d'implémenter :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    template<class T> class FunctorPointerSet
    Vu l'erreur c peut etre ca.

  9. #9
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Chez moi, ça compile sous VC++Express et gcc:
    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
     
    #include <set>
    class Vertex {
     
    public:
      // Constructeur
      Vertex (double x, double y, double z);
      // Accesseur
      const double &x() const;
      const double &y() const;
      const double &z() const;
     
    private:
      double _x, _y, _z;
    };
     
    //Opérateur de comparaison
    bool operator== (Vertex &a, Vertex &b);
    bool operator!= (Vertex &a, Vertex &b);
    bool operator>= (Vertex &a, Vertex &b);
    bool operator<= (Vertex &a, Vertex &b);
    bool operator>  (Vertex &a, Vertex &b);
    bool operator<  (Vertex &a, Vertex &b);
     
    class FoncteurVertex {
    public:
      bool operator() (const Vertex *a, const Vertex *b) const;
    };
     
    int main(int, char)
    {
     
       std::set<Vertex*,FoncteurVertex> mon_ensemble;
     
    	return 0;
    }
    En toute logique, tes surcharges des opérateurs devraient plus ressembler à :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool operator== (Vertex const &a, Vertex const &b);

  10. #10
    Rédacteur/Modérateur
    Avatar de JolyLoic
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Août 2004
    Messages
    5 463
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Août 2004
    Messages : 5 463
    Points : 16 213
    Points
    16 213
    Par défaut
    Citation Envoyé par laflak Voir le message
    Mais voila j'ai un problème à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    erreur: invalid initialization of reference of type ‘const std::set<Vertex*, std::less<Vertex*>, std::allocator<Vertex*> >&’ from expression of type ‘const std::set<Vertex*, FoncteurVertex, std::allocator<Vertex*> >’
    J'ai l'impression que dans ton code, tu mélange des set<Vertex *> et des set<Vertex*, FoncteurVertex>, qui sont deux types différents.

    PS : Le nommage de FoncteurVertex n'est pas très indicatif. Un truc genre CompareVertexPointer me semblerait plus clair. Il est de plus possible d'écrire un tel foncteur qui marche pour tout type de pointeur, pas seulement des pointeurs sur Vertex (je me demande s'il n'y en a pas un tout fait dans boost, mais autrement, c'est assez simple).
    Ma session aux Microsoft TechDays 2013 : Développer en natif avec C++11.
    Celle des Microsoft TechDays 2014 : Bonnes pratiques pour apprivoiser le C++11 avec Visual C++
    Et celle des Microsoft TechDays 2015 : Visual C++ 2015 : voyage à la découverte d'un nouveau monde
    Je donne des formations au C++ en entreprise, n'hésitez pas à me contacter.

  11. #11
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    J'ai rajouté les const pour mes opérateurs surchargés et je suis en train de regarder pour implémenter mon template fonctor.

  12. #12
    Rédacteur
    Avatar de 3DArchi
    Profil pro
    Inscrit en
    Juin 2008
    Messages
    7 634
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2008
    Messages : 7 634
    Points : 13 017
    Points
    13 017
    Par défaut
    Penses à quand ton problème le sera

  13. #13
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    bon j'ai continué à tester d'autre truc je pense que je touche au but mais j'ai encore un petit bug.

    Dans mon main :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    set<Vertex*, SortVertex> _vertex;
    Dans comparePointeur.hpp :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct SortVertex {
      bool operator()(Vertex *a, Vertex *b) {
        return ((*a) < (*b));
      }
    };
    Mon message d'erreur à la compilation :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     erreur: invalid initialization of reference of type ‘const std::set<Vertex*, std::less<Vertex*>, std::allocator<Vertex*> >&’ from expression of type ‘const std::set<Vertex*, SortVertex, std::allocator<Vertex*> >’
    Donc voila doit y avoir une ou deux petite modification à faire sur ma structure, je continue à chercher, mais si quelqu'un à la solution ca me ferais plaisir ca fait trop longtemps que je suis sur ces quelque ligne de code.

    Merci d'avance.

  14. #14
    Membre du Club
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    Points : 49
    Points
    49
    Par défaut
    On m'as passé un code qui marche nikel, mais avec des pointeurs d'entiers :

    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
     
    #include <iostream>
    #include <set>
    #include <string>
     
    #include <boost/foreach.hpp>
     
    class A
    {
    public:
        A(int i_ = 0)
         : i(i_)
        {}
     
        int get_i() const { return i;}
     
    private:
        int i;
    };
     
    class Foncteur
    {
    public:
        bool operator()(const A* a, const A* b)
        {
            return a->get_i() < b->get_i();
        }
    };
     
    int main()
    {
        std::set<A*, Foncteur> myset;
     
        myset.insert(new A(5));
        myset.insert(new A(-2));
        myset.insert(new A(87));
        myset.insert(new A(-1));
     
        BOOST_FOREACH(A* ptr, myset)
            std::cout << ptr->get_i() << '\n';
     
        return 0;
    }
    Malheureusement quand je l'adapte à mon code ca me fait :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    erreur: invalid initialization of reference of type ‘const std::set<Face*, std::less<Face*>, std::allocator<Face*> >&’ from expression of type ‘const std::set<Face*, SortFace, std::allocator<Face*> >’
    Mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    class SortVertex {
    public:
      bool operator()(const Vertex *a, const Vertex *b) {
        return ((*a) < (*b));
      }
    };
     
     
    set<Vertex*, SortVertex> _vertex;

  15. #15
    Rédacteur
    Avatar de Laurent Gomila
    Profil pro
    Développeur informatique
    Inscrit en
    Avril 2003
    Messages
    10 651
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Points : 15 920
    Points
    15 920
    Par défaut
    Ce serait plus facile si tu nous montrais ton code. Visiblement tu as toujours le même problème : tu mélanges des set<Vertex*> et des set<Vertex*, SortVertex>.

Discussions similaires

  1. trier un set de pointeurs?
    Par evrybody dans le forum Langage
    Réponses: 9
    Dernier message: 09/01/2010, 16h20
  2. [conception] set de pointeurs
    Par r0d dans le forum SL & STL
    Réponses: 11
    Dernier message: 02/03/2008, 11h34
  3. [Criteria] Résultat mal trié
    Par n@n¤u dans le forum Hibernate
    Réponses: 4
    Dernier message: 11/08/2006, 13h36
  4. Pb de pointeur mal détruit
    Par olive_le_malin dans le forum MFC
    Réponses: 20
    Dernier message: 15/01/2004, 21h20
  5. [LG]problème de tri de pointeur (bulles non optimisé)
    Par blackmage dans le forum Langage
    Réponses: 3
    Dernier message: 20/11/2003, 23h42

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