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.
Partager