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 sur std::vector<std::pair<int, float> >


Sujet :

SL & STL C++

  1. #1
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut tri sur std::vector<std::pair<int, float> >
    Bonjour,

    j'ai un objet de type std::vector<std::pair<int, float> >, et j'aimerais trier ce vecteur par valeurs croissantes de chaque premier élément (l'entier) des paires.
    J'ai essayé avec std::sort sans succès :/
    Merci

  2. #2
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    Ca marche très bien avec sort si on lui donne la fonction de comparaison, non ?

  3. #3
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    ben comme fonction, j'ai fourni
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    bool CAffranchissement::is_greater_pair_int_float(const pair<int, float> &left, const pair<int, float> &right)
    {
      return left.first > right.first;
    }
    mais y a une template de <algorithm> qui ne compile pas, je vais retrouver l'erreur précise

    Edit: donc dans <algorithm>:
    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
     
    template<class _RanIt,
    	class _Pr> inline
    	pair<_RanIt, _RanIt> _Unguarded_partition(_RanIt _First, _RanIt _Last,
    		_Pr _Pred)
    	{	// partition [_First, _Last), using _Pred
    	_RanIt _Mid = _First + (_Last - _First) / 2;
    	_Median(_First, _Mid, _Last - 1, _Pred);
    	_RanIt _Pfirst = _Mid;
    	_RanIt _Plast = _Pfirst + 1;
     
    	while (_First < _Pfirst
    		&& !_Pred(*(_Pfirst - 1), *_Pfirst)
    		&& !_Pred(*_Pfirst, *(_Pfirst - 1)))
    		--_Pfirst;
    	while (_Plast < _Last
    		&& !_Pred(*_Plast, *_Pfirst)
    		&& !_Pred(*_Pfirst, *_Plast))
    		++_Plast;
    _Pred(*(_Pfirst - 1), *_Pfirst) ===> term does not evaluate to a function taking 2 arguments

    Et j'appelle mon sort comme ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    sort(price->begin(), price->end(), CAffranchissement::is_greater_pair_int_float);
    (Oui j'ai oublié de préciser, le prédicat est une méthode statique de classe)


    Edit2: j'ai corrigé le prototype de la fonction

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Ta fonction devrait etre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    bool cmp(std::pair<int, float> const & left, std::pair<int, float> const & right)
    {
        return left.first > right.first;
    }
    avec les const en plus, vu que cmp ne modifie pas ses arguments.

  5. #5
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut
    La const & std::pair est correcte, mais il faut effectuer la comparaison sur le < et non le >, à ce que j'en sache.

  6. #6
    Membre averti
    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
    Points : 307
    Points
    307
    Par défaut
    J'étais persuadé que l'opérateur < était défini pour les std::pair ?
    De la manière que tu souhaites en plus (première valeur prioritaire sur la seconde)

    un simple std::sort sur ton vector devrait suffir et sans rien préciser.

  7. #7
    Membre averti
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 45
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    Points : 307
    Points
    307
    Par défaut
    Les paires contiennent bien un operateur < qui utilise l'ordre lexicographique (cf. standard 20.2.2-6).

    Et si on veut passer par la fonction cmp, elle devrait effectivement utiliser la comparaison < a la place de > pour obtenir l'effet voulu.

  8. #8
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut
    Au fait, question au passage, pourquoi tu utilises un vecteur de std::pair et non pas une std::map ?

    Dans ce cas, effetivement, un comparateur < est défini, qui plus est pour int.

  9. #9
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    il me semble que c'est l'opérateur '=' qui n'est pas défini sur les std::pair (la fonction template swap() de <algorithm> utilise l'opérateur '=', et swap() est appelé par sort() on dirait)
    mais je devrais m'en sortir en utilisant une map, effectivement (c'est plus chohérent vu que chaque paire de valeurs que j'utilise est unique)

  10. #10
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    operator= existe pour les std::pair, ça j'en suis sûr, je l'utilise régulièrement !

  11. #11
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    exact, autant pour moi... ben le probleme est encore autre part

  12. #12
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    pour sorter une map selon les clés, je fais comment?

  13. #13
    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 : 42
    Localisation : France, Pyrénées Atlantiques (Aquitaine)

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

    Informations forums :
    Inscription : Juillet 2005
    Messages : 9 810
    Points : 20 970
    Points
    20 970
    Par défaut
    C'est automatique, c'est un conteneur trié.

  14. #14
    b4u
    b4u est déconnecté
    Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    Points : 64
    Points
    64
    Par défaut
    merci

  15. #15
    Membre à l'essai
    Inscrit en
    Mars 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 14
    Points : 12
    Points
    12
    Par défaut
    Citation Envoyé par Kurisu
    Au fait, question au passage, pourquoi tu utilises un vecteur de std::pair et non pas une std::map ?
    c'est pas vraiment la meme chose ...
    il n'a peut etre pas besoin de l'unicité des int ...

  16. #16
    Membre averti
    Homme Profil pro
    Game Graphics Programmer
    Inscrit en
    Août 2006
    Messages
    408
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Allemagne

    Informations professionnelles :
    Activité : Game Graphics Programmer
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Août 2006
    Messages : 408
    Points : 392
    Points
    392
    Par défaut
    Citation Envoyé par KangOl
    c'est pas vraiment la meme chose ...
    il n'a peut etre pas besoin de l'unicité des int ...
    dans ce cas, une std::multimap fera l'affaire, mais pour le principe, ca revient au même, non?

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

Discussions similaires

  1. Cast d'un std::vector<T> -> std::vector<X>
    Par Dono_S dans le forum Langage
    Réponses: 3
    Dernier message: 09/04/2012, 21h31
  2. Problème de tri sur un vector.
    Par AF_2.8 dans le forum SL & STL
    Réponses: 3
    Dernier message: 05/05/2011, 10h07
  3. std::list ou std::vector comme argument de template
    Par epsilon68 dans le forum C++
    Réponses: 11
    Dernier message: 01/03/2011, 23h34
  4. [Tuto] Recherche de tutoriel sur std::list et std::vector
    Par pegase06 dans le forum SL & STL
    Réponses: 27
    Dernier message: 24/07/2007, 16h23
  5. 3 précisions sur l'utilisation des "std::vector"
    Par Invité dans le forum SL & STL
    Réponses: 9
    Dernier message: 10/01/2006, 00h42

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