EDIT : en utilisant c++14, la meilleure solution est très facile à écrire grâce aux lambdas qui peuvent maintenant avoir des paramètres de type auto
. C'est ma solution préférée du moment
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
PREMIÈRE RÉPONSE :
Il suffit d'utiliser un comparateur personnalisé (il s'agit d'un troisième argument facultatif de la commande std::sort
)
struct sort_pred {
bool operator()(const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
}
};
std::sort(v.begin(), v.end(), sort_pred());
Si vous utilisez un compilateur C++11, vous pouvez écrire la même chose en utilisant des lambdas :
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
EDIT En réponse aux modifications apportées à votre question, voici quelques réflexions ... si vous vraiment Pour être créatif et pouvoir réutiliser souvent ce concept, il suffit de créer un modèle :
template <class T1, class T2, class Pred = std::less<T2> >
struct sort_pair_second {
bool operator()(const std::pair<T1,T2>&left, const std::pair<T1,T2>&right) {
Pred p;
return p(left.second, right.second);
}
};
alors vous pouvez le faire aussi :
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
ou même
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
Mais pour être honnête, tout cela est un peu exagéré, il suffit d'écrire la fonction de 3 lignes et d'en finir avec elle :-P
0 votes
Voici un exemple :<br> std::sort dans un vecteur de paires
1 votes
c++ n'a pas de lamdas donc vous ne pouvez pas faire exactement ce que vous voulez, vous devrez créer une fonction/functeur séparé. Cela peut se faire en une seule fois, donc cela ne devrait pas être un gros problème.
2 votes
Le C++ a des lambdas maintenant ! Woo !