EDITAR : usando c ++ 14, la mejor solución es muy fácil de escribir gracias a lambdas que ahora puede tener parámetros de tipo auto
. Esta es mi solución favorita actual
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Simplemente use un comparador personalizado (es un tercer argumento opcional para 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 está utilizando un compilador de C ++ 11, puede escribir lo mismo con lambdas:
std::sort(v.begin(), v.end(), [](const std::pair<int,int> &left, const std::pair<int,int> &right) {
return left.second < right.second;
});
EDITAR : en respuesta a sus ediciones a su pregunta, aquí hay algunos pensamientos ... si realmente quiere ser creativo y poder reutilizar mucho este concepto, simplemente haga una plantilla:
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);
}
};
entonces puedes hacer esto también:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
o incluso
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
Aunque para ser honesto, todo esto es un poco exagerado, solo escriba la función de 3 líneas y termine con ella :-P