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 :

[STL]vector de type composé et fonction sort


Sujet :

SL & STL C++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2005
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 513
    Par défaut [STL]vector de type composé et fonction sort
    Bonsoir a tous,
    voila je suis en train de réaliser un programme qui utilise la STL. Seulement en ce moment je me heurte à un problème avec cette derniere.
    dans mon programme de déclare une structure comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    struct T
    {
        string a;
        int b;
    };
    ensuite je stock ca dans un vector:
    le problème est que je voudrait trier ce tableau avec la fonction sort() de la STL, pour ce faire il faut donc que je fournisse un prédicat à la fonction sort() pour l'utiliser comme ceci:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort( tab.begin(), tab.end(), Predicat );
    le problème, c'est que je ne comprend pas comment écrire cette fonction Predicat. J'espere donc que quelqu'un pourra m'aider à comprendre comment écrire la fonction. Sachant que je veux trier les éléments par élément a alphabétique.

    Merci par avance.

  2. #2
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    Quelque chose comme ça peut être

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    struct Predicat {
      bool operator()( const T& a, const T& b ) {
        return ( a.a < b.a ) || ( !( b.a < a.a ) && ( a.b < b.b ) );
      }
    };
    j'aime assez mon choix de nom de variable (rhs et lhs c'est du déjà vu )

  3. #3
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2005
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 513
    Par défaut
    oui j'ai vu cela dans la doc de la STL, mais je ne comprend pas comment s'en servir, désoler de te demander ca, mais tu pourrais pousser un peu ton exemple stp.

  4. #4
    Expert éminent
    Avatar de koala01
    Homme Profil pro
    aucun
    Inscrit en
    Octobre 2004
    Messages
    11 644
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 53
    Localisation : Belgique

    Informations professionnelles :
    Activité : aucun

    Informations forums :
    Inscription : Octobre 2004
    Messages : 11 644
    Par défaut
    Salut,

    Les conteneurs associatifs de la STL (bon, d'accord, un vecteur n'est pas associatif, mais bon) utilisent par défaut un predicat "less"...

    Ce peut etre une bonne idée de l'utiliser pour résoudre ton problème.

    Cela prend, souvent, la forme d'une structure imbriquée au sein meme de la structure à laquelle il est rattaché, sous la forme de
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    struct mastruct
    {
        type data1;
        type2 data2;
        struct less
        {
            bool operator() (const mastruct& s1, const mastruct& s2)
            {
               (le moyen de déterminer si s1<s2)
            }
        };
    };
    Par habitude, je place le prédicat au sein de la structure, mais je ne sais pas du tout si, de fait, c'est une obligation ou si on peut le placer en dehors de celle-ci
    A méditer: La solution la plus simple est toujours la moins compliquée
    Ce qui se conçoit bien s'énonce clairement, et les mots pour le dire vous viennent aisément. Nicolas Boileau
    Compiler Gcc sous windows avec MinGW
    Coder efficacement en C++ : dans les bacs le 17 février 2014
    mon tout nouveau blog

  5. #5
    Membre expérimenté
    Avatar de David Fleury
    Profil pro
    Inscrit en
    Mars 2004
    Messages
    253
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 253
    Par défaut
    par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    sort( tab.begin(), tab.end(), Predicat() );

  6. #6
    Membre éclairé
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2005
    Messages
    513
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Mai 2005
    Messages : 513
    Par défaut
    voila ce que j'ai écrit:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    // structure fonction/identificateur
    struct TMotCle
    {
    	string ident; // identificateur
    	int param; // nombre parametre
     
    	struct less
    	{
    		bool operator()( const TMotCle &e1, const TMotCle &e2 )
    		{ return ( e1.ident < e2.ident ); }
    	};
    };
    et voici comment je fais le tri:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort( vInstruction.begin(), vInstruction.end() );
    sans succès bien que j'ai esayer la façon de Hylvenir...

  7. #7
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Pour ma part, s'il n'y a que 2 éléments dans la structure et que l'ordre est défini par le premier élément puis le second, je prend std::pair<> plutôt qu'une structure maison.

  8. #8
    Membre chevronné
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Par défaut
    Je suis aussi de l'avi de Miles, un type std::pair ( ou plus directement std::map qui en est grosso modo un typedef ) serait plus approprié dans l'affaire.

    A noter que pour trier le tout avec une clef de type std::string, un stdext::hash_map serait même conseillé.

    Enfin, l'utilisation d'un foncteur permet au compilateur d'inliner le prédicat, ce qui n'est pas possible avec une fonction, on peut donc espérer un petit gain de vitesse (Effective STL, Scott Meyers, 2001).

  9. #9
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Citation Envoyé par NewbiZ
    Je suis aussi de l'avi de Miles, un type std::pair ( ou plus directement std::map qui en est grosso modo un typedef ) serait plus approprié dans l'affaire.
    std::map utilise des std::pair, ce n'est pas un typedef !
    Citation Envoyé par NewbiZ
    Enfin, l'utilisation d'un foncteur permet au compilateur d'inliner le prédicat, ce qui n'est pas possible avec une fonction, on peut donc espérer un petit gain de vitesse (Effective STL, Scott Meyers, 2001).
    Ce n'est pas le fait d'avoir un foncteur qui permet d'inliner, le foncteur permet plus de généricité qu'une fonction simple. Si on veut pouvoir inliner, il faut que la définition du foncteur soit dans l'en-tête. Ici, c'est le cas, mais de manière générale, ce n'est pas obligatoire.

  10. #10
    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 : 41
    Localisation : France, Moselle (Lorraine)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Avril 2003
    Messages : 10 651
    Par défaut
    un type std::pair ( ou plus directement std::map qui en est grosso modo un typedef )
    Fais gaffe à ce que tu dis, certains pourraient mal l'interpréter. D'ailleurs je ne sais même pas ce que tu as voulu dire par là ?

    Ce n'est pas le fait d'avoir un foncteur qui permet d'inliner, le foncteur permet plus de généricité qu'une fonction simple
    Si, quand même. Avec un pointeur de fonction, même si elle est inlinée, le compilo n'ira pas supprimer l'indirection tout seul.

  11. #11
    Membre chevronné
    Avatar de NewbiZ
    Profil pro
    Étudiant
    Inscrit en
    Juillet 2002
    Messages
    184
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Juillet 2002
    Messages : 184
    Par défaut
    Je ne faisais que souligner qu'un
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    std::vector< std::pair< std::string, int> >
    reviens à utiliser un std::map

    De même pour l'utilisation du foncteur, je ne faisais que donner une petite astuce pas forcément connue. Il me semble évident que si () n'est pas inline, il ne sera pas inliné...

    Il ne faut pas prendre à la lettre tout ce que je dis

  12. #12
    Rédacteur

    Avatar de Matthieu Brucher
    Profil pro
    Développeur HPC
    Inscrit en
    Juillet 2005
    Messages
    9 810
    Détails du profil
    Informations personnelles :
    Âge : 43
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

    Informations professionnelles :
    Activité : Développeur HPC
    Secteur : Industrie

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Par défaut
    Effectivement, on peut voir ça comme ça, mais comme il trie sur les 2 éléments de sa structure, c'est peut-être plus un std::set

Discussions similaires

  1. [STL] Débutant : problème utilisation fonction Sort
    Par marcootz dans le forum SL & STL
    Réponses: 5
    Dernier message: 29/08/2007, 20h19
  2. Probleme fonction sort d'unt list STL
    Par Brouzouf dans le forum Visual C++
    Réponses: 4
    Dernier message: 27/07/2006, 16h54
  3. [STL] vector<string> et appel de fonctions.
    Par guejo dans le forum MFC
    Réponses: 4
    Dernier message: 08/10/2004, 17h36
  4. vector<bool> comme argument de fonction
    Par Krishna dans le forum SL & STL
    Réponses: 11
    Dernier message: 09/09/2004, 08h30
  5. STL::vector crash a l"execution
    Par sebA dans le forum MFC
    Réponses: 2
    Dernier message: 16/06/2004, 16h36

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