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
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
Ca marche très bien avec sort si on lui donne la fonction de comparaison, non ?
ben comme fonction, j'ai fourni
mais y a une template de <algorithm> qui ne compile pas, je vais retrouver l'erreur précise
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; }
Edit: donc dans <algorithm>:
_Pred(*(_Pfirst - 1), *_Pfirst) ===> term does not evaluate to a function taking 2 arguments
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;
Et j'appelle mon sort comme ça:
(Oui j'ai oublié de préciser, le prédicat est une méthode statique de classe)
Code : Sélectionner tout - Visualiser dans une fenêtre à part sort(price->begin(), price->end(), CAffranchissement::is_greater_pair_int_float);
Edit2: j'ai corrigé le prototype de la fonction
Ta fonction devrait etre :
avec les const en plus, vu que cmp ne modifie pas ses arguments.
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; }
La const & std::pair est correcte, mais il faut effectuer la comparaison sur le < et non le >, à ce que j'en sache.
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.
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.
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.
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)
operator= existe pour les std::pair, ça j'en suis sûr, je l'utilise régulièrement !
exact, autant pour moi... ben le probleme est encore autre part
C'est automatique, c'est un conteneur trié.
c'est pas vraiment la meme chose ...Envoyé par Kurisu
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?Envoyé par KangOl
Partager