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

Discussion :

QSet<ptr*> liste triée

  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 QSet<ptr*> liste triée
    Bonjour,

    Je tente actuellement de faire une liste triée d'objet de type Vertex*.
    Je vous met les fichiers vertex.hpp et vertex.cpp

    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
     
    #ifndef VERTEX_HPP
    #define VERTEX_HPP
     
    class Vertex {
     
    public:
      // Constructeur
      Vertex (float x, float y, float z);
     
      // Accesseur en lecture seulement
      const float &x () const;
      const float &y () const;
      const float &z () const;
     
    private:
      float _x, _y, _z;
     
    };
     
    // Opérateur de comparaison
    bool operator== (const Vertex &v1, const Vertex &v2);
    bool operator!= (const Vertex &v1, const Vertex &v2);
    bool operator>  (const Vertex &v1, const Vertex &v2);
    bool operator<= (const Vertex &v1, const Vertex &v2);
    bool operator<  (const Vertex &v1, const Vertex &v2);
    bool operator>= (const Vertex &v1, const Vertex &v2);
     
    #endif /* 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
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
     
    #include "vertex.hpp"
     
    /*
      Constructeur :
    */
     
    Vertex::Vertex (float x, float y, float z) {
      _x = x;
      _y = y;
      _z = z;
    }
     
    /*
      Accesseur :
      en lecture seulement
    */
     
    const float &Vertex::x () const {
      return _x;
    }
     
    const float &Vertex::y () const {
      return _y;
    }
     
    const float &Vertex::z () const {
      return _z;
    }
     
    /*
      Opérateur :
    */
     
    bool operator== (const Vertex &v1, const Vertex &v2) {
      return ((v1.x() == v2.x()) &&
    	  (v1.y() == v2.y()) &&
    	  (v1.z() == v2.z()));
    }
     
    bool operator!= (const Vertex &v1, const Vertex &v2) {
      return (!(v1 == v2));
    }
     
    bool operator>  (const Vertex &v1, const Vertex &v2) {
     
      if (v1.x() > v2.x())
        return true;
      else if (v1.x() < v2.x())
        return false;
     
      if (v1.y() > v2.y())
        return true;
      else if (v1.y() < v2.y())
        return false;
     
      if (v1.z() > v2.z())
        return true;
      else if (v1.z() < v2.z())
        return false;
     
      return false;
    }
     
    bool operator<= (const Vertex &v1, const Vertex &v2) {
      return (!(v1 > v2));
    }
     
    bool operator<  (const Vertex &v1, const Vertex &v2) {
     
      if (v2.x() > v1.x())
        return true;
      else if (v2.x() < v1.x())
        return false;
     
      if (v2.y() > v1.y())
        return true;
      else if (v2.y() < v1.y())
        return false;
     
      if (v2.z() > v1.z())
        return true;
      else if (v2.z() < v1.z())
        return false;
     
      return false;
    }
     
    bool operator>= (const Vertex &v1, const Vertex &v2) {
      return (!(v1 < v2));
    }
    Pour faire une liste triée j'ai donc besoin de pouvoir comparer mes vertex : c'est pour cela que j'ai surchargé les opérateurs de comparaison.

    Pour faire ma liste triée de vertex je me suis orienté vers la classe QSet pensant que son utilisation serait simple sauf que lorsque je crée plusieurs objet Vertex

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    Vertex *v1 = new Vertex (...);
    Vertex *v2 = new Vertex (...);
    Vertex *v3 = new Vertex (...);
    Vertex *v4 = new Vertex (...);
    et que en suite je les rajoute dans mon QSet

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    QSet <Vertex *> _vertex;
    _vertex.insert(v1);
    _vertex.insert(v2);
    _vertex.insert(v3);
    _vertex.insert(v4);
    alors les éléments ne sont pas triés comme je le voudrais.

    J'ai également remarqué que pour utiliser mes opérateur de comparaison je devais
    utilisé (*var) : Ainsi

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    if (v1 == v2) // Erroné
    if ((*v1) == (*v2)) // Bon
    Comment je dois donc faire pour avoir un QSet trié ou pour que mes opérateur de comparaison surchargé n'envoie pas une réponse érroné pour (a == b).

    Merci d'avance.

  2. #2
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut,
    c'est parce que tu utilise des pointeurs. Donc ton set se trie par la valeur de tes pointeurs.
    Si vraiment tu veut utiliser des pointeur, utilise std::set auquel tu peut donner une fonction de comparaison

  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
    J'ai donc aucun moyen d'utiliser mes pointeurs avec mes QSet.
    Ok je teste cela en rentrant chez moi ce soir et je poste mes résultats quand ca marche.

    Merci.

  4. #4
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par laflak Voir le message
    J'ai donc aucun moyen d'utiliser mes pointeurs avec mes QSet.
    Ok je teste cela en rentrant chez moi ce soir et je poste mes résultats quand ca marche.

    Merci.
    Avec QSet apparemment non. En tous cas j'ai rien trouvé pour donner un prédicat pour le trie du set.

  5. #5
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    Un QSet ne trie pas, il stocke ses éléments dans une table de hachage.
    Les QMap, quant à elles, trient sur leur clé (avec < ).

  6. #6
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par kinji1 Voir le message
    Un QSet ne trie pas, il stocke ses éléments dans une table de hachage.
    Les QMap, quant à elles, trient sur leur clé (avec < ).
    ha ouais tiens le QSet n'est pas trié.
    Merci pour l'info

  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
    QMap je ne suis pas sur que cela correspondent à l'utilisation que je veux.

    En effet il ne m'interressent pas d'avoir une clé associé à mon objet. Je souhaite une structure ou mon objet est inseré dans la table et directement "trié".

    La suis au boulot, je peux pas tester, mais ce soir je regarde si j'y arrive avec std::set. Sinon la solution est peut-etre de me créer moi meme une tel structure ou en gros mon objet est sa propre clé.

  8. #8
    Membre confirmé

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    Points : 644
    Points
    644
    Par défaut
    J'ai pas vu de conteneur Qt qui soit trié avec juste les éléments, (une QMap avec juste les clés quoi), donc soit tu utilises QMap avec la clé pour ce que tu veux trier et la valeur tu t'en sers pas, soit tu utilises std::set.
    Et si tu trouves que std::set n'a pas l'interface que tu veux, tu peux toujours l'encapsuler dans une classe avec l'interface qui te plaît.

  9. #9
    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
    Ouaip je vais faire un truc du genre kinji1.
    Merci beaucoup je vous tiens au courant.

  10. #10
    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 reprend le projet que j'avais du laisser par manque de temps.

    J'ai testé std::set par contre j'ai l'impression qu'il ne trie pas en fonction de mes comparateur bool opérator$$ (const Vertex &a,const Vertex &b) mais en fonction de la valeur de l'adresse du pointeur.

    Je continue à chercher mais si quelqu'un à une idée Merci d'avance.

  11. #11
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Salut,
    comment est déclaré ton set?

  12. #12
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par laflak Voir le message
    bool opérator$$ (const Vertex &a,const Vertex &b)
    Ca devrait pas plutôt être:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    bool opérator$$ (const Vertex *a,const Vertex *b)
    Sinon une solution sera d'utiliser:

    comme ca ta map sera triée en fonction de *ptr. (une surcharge d'opérateur est nécessaire selon le contenu de *ptr)

  13. #13
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    Citation Envoyé par Nehmé Voir le message
    Sinon une solution sera d'utiliser:

    comme ca ta map sera triée en fonction de *ptr. (une surcharge d'opérateur est nécessaire selon le contenu de *ptr)
    ?? pourquoi faire une copie le l'objet pour la clef et un pointeur vers un objet pour la data???

  14. #14
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Citation Envoyé par Mongaulois Voir le message
    ?? pourquoi faire une copie le l'objet pour la clef et un pointeur vers un objet pour la data???
    Une copie de l'objet: Au cas où il ne trouve pas de moyen de trier avec les pointeurs.

    Pourquoi garder le pointeur:
    D'après ce que j'ai compris, il veut garder ses pointeurs par ce que il veut les utiliser pour modifier des objects pointés et non pas pour lire uniquement leurs contenus

  15. #15
    yan
    yan est déconnecté
    Rédacteur
    Avatar de yan
    Homme Profil pro
    Ingénieur expert
    Inscrit en
    Mars 2004
    Messages
    10 033
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 42
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Ingénieur expert
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Mars 2004
    Messages : 10 033
    Points : 13 968
    Points
    13 968
    Par défaut
    le seul truc c'est que la copie est plutôt inutile.
    Il faut mieux un std::set avec ton prédicat

  16. #16
    Membre régulier
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    248
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : Canada

    Informations forums :
    Inscription : Septembre 2008
    Messages : 248
    Points : 119
    Points
    119
    Par défaut
    Sinon une solution sera d'utiliser:


    Code :
    QMap<*ptr,ptr>
    C'est pour ca j'avais dis "Sinon"

Discussions similaires

  1. [1.x] sfValidatorDoctrineChoice : liste triée et filtrée
    Par etoileweb dans le forum Symfony
    Réponses: 3
    Dernier message: 20/10/2010, 16h56
  2. [XL-2000] Liste Triée sans doublon
    Par cobra38 dans le forum Excel
    Réponses: 4
    Dernier message: 07/07/2010, 23h13
  3. position dans une liste triée
    Par mdr_cedrick dans le forum Langage SQL
    Réponses: 6
    Dernier message: 27/11/2008, 15h33
  4. liste triée mais pas SortedList :p
    Par duaner dans le forum C#
    Réponses: 6
    Dernier message: 19/09/2007, 17h10
  5. Recherche d'un élément dans une liste triée (vitesse)
    Par Rodrigue dans le forum Algorithmes et structures de données
    Réponses: 9
    Dernier message: 18/05/2006, 09h23

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