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 :

Tri du set pour une POD structure


Sujet :

SL & STL C++

  1. #1
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut Tri du set pour une POD structure
    Bonjour,

    Le conteneur <set> de la stl permet de collecter une liste d'objets uniques triée.

    Lorsque je créé une structure contenant un string, un double, un autre string etc... quel critère est utilisé pour trier mes objets dans le set ? Je n'ai pas défini d'oprateur particulier de comparaison pour ma structure mais ça compile quand même ...

  2. #2
    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 : 50
    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
    Il n'y a pas de critère défini par défaut.

    Si ton code compile, c'est sans doute probablement parce que tu n'as pas utilisée encore ton set. Actuellement, le code suivant compile :

    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
    #include <set>
     
    using namespace std;
     
    class A
    {
    	int i;
    };
     
     
    int main()
    {
    	set<A> s;
    	A a;
    	//s.insert(a);
        return 0;
    }
    Mais dès qu'on enlève les commentaires, il cessera de compiler. Les templates ne sont compilés que lorsqu'on en a besoin, et dans mon exemple, avant que l'on veuille insérer un élément dans un set, l'opérateur< n'étais pas requis.

    A noter que dans une prochaine version de le norme, ce genre d'erreur sera probablement détecté plus tôt (et avec de meilleurs messages) grâce aux concepts.

  3. #3
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Je viens de m'apercevoir d'une chose que j'avais totalement zappé :

    Je n'ai pas un set d'objets A mais plutôt de pointeurs vers des objets A.

    Et j'ai bien des insertions déjà.

    J'imagine que le tri de pointeurs vers n'importe quoi est une chose que le compilo arrive à gérer, mais à mon avis pas du tout comme je l'attends.

    Je devrais pouvoir tenter de redéfinir l'opérateur < pour les pointeurs vers mon objet A, je vais faire le test.

  4. #4
    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 : 50
    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 NiamorH Voir le message
    J'imagine que le tri de pointeurs vers n'importe quoi est une chose que le compilo arrive à gérer, mais à mon avis pas du tout comme je l'attends.
    Il trie donc tes objets selon l'ordre dans lequel ils apparaissent en mémoire...

  5. #5
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Tout à fait.

    Mais je suis un peu bloqué... :

    Citation Envoyé par msdn
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    // C2803.cpp
    // compile with: /c
    class A{};
    bool operator< (const A *left, const A *right);   // C2803
    // try the following line instead
    // bool operator< (const A& left, const A& right);
    Impossible de redéfinir le comportement de comparaison de pointeurs vers mes objets.
    Et ça me gène de devoit faire mon set sur des données non pointeurs. La solution que je vois pour éviter de faire des copies de ma structure, c'est d'utiliser un objet rien que pour encapsuler un pointeur vers ma structure... Pas très beau. Y a-t-il d'autres possibilités ?

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    92
    Détails du profil
    Informations personnelles :
    Âge : 51
    Localisation : France, Côte d'Or (Bourgogne)

    Informations forums :
    Inscription : Mai 2005
    Messages : 92
    Points : 108
    Points
    108
    Par défaut
    Donner un foncteur de comparaison en deuxième argument template de set?

  7. #7
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Bonne idée,

    je ne me rappellais même pas de son existence...

    Je vais tester.

  8. #8
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051

  9. #9
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    Je vois pas l'utilité en fait... C'est un avantage de ne pas avoir à définir d'opérateur de comparaison tu crois pas ?

    Après tout, std::set<> est censé représenter un ensemble, où il n'y a pas de notion d'ordre. La relation d'ordre c'est juste pour permettre une implémentation sous forme d'arbre équilibré.

  10. #10
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Après tout, std::set<> est censé représenter un ensemble, où il n'y a pas de notion d'ordre.
    Pourrais-tu me dire d'où tu tiens ça ? Le std::set est plus qu'un ensemble d'objets uniques, c'est un ensemble d'objets uniques trié.

    Moi j'ai :
    Citation Envoyé par cppreference.com
    The C++ Set is an associative container that contains a sorted set of unique objects.
    S'il ne l'avait pas été je ne le l'aurais en fait même pas choisi, vu que j'ai besoin d'avoir mes éléments triés selon leur code alphanum pour ensuite les traiter un par un dans le bon ordre, ce qui devrait répondre à ton interrogation :
    Je vois pas l'utilité en fait...
    C'est un avantage de ne pas avoir à définir d'opérateur de comparaison tu crois pas ?
    C'est clair, mais il est aussi évident que si je ne le fait pas ici, je n'aurai plus le résultat attendu.

    La relation d'ordre c'est juste pour permettre une implémentation sous forme d'arbre équilibré.
    Je crois que certains algos de la STL utilisent cette propriété pour plus de perfs : set_union/intersection/difference etc.
    Dans mon cas elle m'est utile car elle m'évite de faire un std::sort sur un vector ou autre.

    à plus.

  11. #11
    Membre éclairé Avatar de HanLee
    Profil pro
    Inscrit en
    Mai 2004
    Messages
    738
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Rhône (Rhône Alpes)

    Informations forums :
    Inscription : Mai 2004
    Messages : 738
    Points : 871
    Points
    871
    Par défaut
    OK pour l'utilisation.

    Sinon je dis pas que la norme ne lui impose pas d'être trié mais que la norme lui imposait d'être trié pour des raisons de performances, parce que sans ça on n'aurait que des complexités linéaires... Juste pour dire que ça s'appelait pas 'set' pour rien .

  12. #12
    Membre éprouvé
    Avatar de NiamorH
    Inscrit en
    Juin 2002
    Messages
    1 309
    Détails du profil
    Informations forums :
    Inscription : Juin 2002
    Messages : 1 309
    Points : 1 051
    Points
    1 051
    Par défaut
    Alors on est d'accord.

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

Discussions similaires

  1. un modèle à suivre pour une analyse structurée
    Par yaciin dans le forum Général Conception Web
    Réponses: 0
    Dernier message: 14/05/2014, 10h06
  2. Pb avec un SET pour une variable DATETIME
    Par tibofo dans le forum Développement
    Réponses: 7
    Dernier message: 24/05/2011, 08h32
  3. Choix d'un ERP pour une petite structure
    Par Enhide dans le forum Forum général ERP
    Réponses: 5
    Dernier message: 27/04/2011, 18h56
  4. Réponses: 3
    Dernier message: 13/04/2006, 18h04
  5. Réponses: 1
    Dernier message: 09/02/2006, 11h03

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