Sì, ci sono vari modi. Te li descrivo dal più base (ma “scorretto”) al più avanzato.
Primo modo: scambiare l’ordine degli elementi nei pair. Semplicemente, anziché salvare le coppie come (a, b), le salvi come (b, a). A questo punto chiami la funzione sort
e avrai i tuoi pair
ordinati in base a b. L’unico caveat è che poi devi ricordarti che l’ordine degli elementi è scambiato.
Secondo modo: passare a sort una funzione compare. sort
prende come terzo argomento (opzionale) una funzione che gli dice come deve ordinare gli elementi. L’ordinamento di default è il minore stretto, ma si possono definire criteri completamente diversi. In particolare, se gli elementi sono pair
, puoi dire a sort
di ordinarli in base al secondo elemento. Ecco come:
// fuori dal main
bool compare(const pair<int, int>& a, const pair<int, int>& b) {
if (a.second == b.second)
return a.first < b.first;
return a.second < b.second;
}
// dentro il main o qualche altra funzione
vector<pair<int, int>> v;
// riempi v in qualche modo
sort(v.begin(), v.end(), compare);
La funzione compare
prende due pair
di interi (se non sai cosa vogliono dire const
e la &
, chiedimi pure) e ritorna true
se e solo se il primo deve venire prima del secondo nell’ordinamento. In questo caso, ritorna true
quando il secondo elemento del primo pair
è strettamente minore di quello del secondo, e se sono uguali, quando il primo elemento è minore.
Terzo modo: come prima, ma usando una lambda. Se non sai cosa sono le lambda expression, salta pure questa parte (in pratica, una lambda è una funzione che puoi scrivere direttamente all’interno di un’altra funzione). Il codice in questo caso è più compatto, ma anche più misterioso:
sort(v.begin(), v.end(), [](const pair<int, int>& a, const pair<int, int>& b) {
if (a.second == b.second)
return a.first < b.first;
return a.second < b.second;
});