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 confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    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 : 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
    Ca marche très bien avec sort si on lui donne la fonction de comparaison, non ?

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    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 chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    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 éclairé
    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
    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 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
    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 chevronné
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    258
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France, Bas Rhin (Alsace)

    Informations forums :
    Inscription : Juillet 2006
    Messages : 258
    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 éclairé
    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
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    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 : 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
    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 confirmé
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    87
    Détails du profil
    Informations personnelles :
    Localisation : France

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

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

    Informations forums :
    Inscription : Mars 2006
    Messages : 87
    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 : 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
    C'est automatique, c'est un conteneur trié.

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

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

  15. #15
    Membre habitué
    Inscrit en
    Mars 2006
    Messages
    14
    Détails du profil
    Informations forums :
    Inscription : Mars 2006
    Messages : 14
    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 éclairé
    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
    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