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

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    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 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    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 confirmé
    Inscrit en
    Mars 2008
    Messages
    63
    Détails du profil
    Informations forums :
    Inscription : Mars 2008
    Messages : 63
    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 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    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 chevronné

    Inscrit en
    Octobre 2007
    Messages
    234
    Détails du profil
    Informations forums :
    Inscription : Octobre 2007
    Messages : 234
    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 035
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    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 035
    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

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