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
Version imprimable
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éciseCode:
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 argumentsCode:
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: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:
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
pour sorter une map selon les clés, je fais comment?
C'est automatique, c'est un conteneur trié.
merci :)
c'est pas vraiment la meme chose ...Citation:
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?Citation:
Envoyé par KangOl