EDIT : usando c ++ 14, a melhor solução é muito fácil de escrever, graças às lambdas que agora podem ter parâmetros do tipo auto
. Esta é a minha solução favorita atual
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Basta usar um comparador personalizado (é um terceiro argumento opcional 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());
Se você estiver usando um compilador C ++ 11, poderá escrever o mesmo usando 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 : em resposta às suas edições à sua pergunta, eis algumas reflexões ... se você realmente quer ser criativo e poder reutilizar muito esse conceito, basta criar um modelo:
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);
}
};
então você pode fazer isso também:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
ou mesmo
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
Embora, para ser honesto, isso seja um pouco exagerado, basta escrever a função de 3 linhas e concluir com ela :-P