EDIT: przy użyciu C++ 14, najlepszym rozwiązaniem jest bardzo łatwe do napisania dzięki do lambd, które mogą teraz mieć parametry typu auto
. To jest moje obecne rozwiązanie ulubiony
std::sort(v.begin(), v.end(), [](auto &left, auto &right) {
return left.second < right.second;
});
Wystarczy użyć niestandardowego komparator (jest to opcja 3-ci argument 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());
Jeśli używasz kompilatora C++ 11 , możesz napisać to samo, używając 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: w odpowiedzi na Twoich zmian na swoje pytanie, oto kilka myśli ... jeśli naprawdę chce być kreatywny i móc ponownie wykorzystać tą koncepcją dużo, po prostu zrobić szablon:
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);
}
};
następnie można to zrobić też:
std::sort(v.begin(), v.end(), sort_pair_second<int, int>());
lub nawet
std::sort(v.begin(), v.end(), sort_pair_second<int, int, std::greater<int> >());
Choć szczerze mówiąc, to wszystko jest trochę przesada, wystarczy napisać funkcję linia 3 i być z nim zrobić :-P
C++ nie ma lamdas, więc nie możesz zrobić dokładnie tego, czego chcesz, musisz utworzyć oddzielną funkcję/funktor. Może to być jeden liniowiec, więc naprawdę nie powinno to być wielkim problemem. –
Oto przykład:
[std :: sort w wektorze par] (http://www.codeguru.com/forum/archive/index.php/t-325645.html) – LeppyR64