2013-08-07 21 views
12

Heyho,Sortowanie wektor par

mam pytanie o sortowaniu wektor par:

std::vector<std::pair<double,Processor*>> baryProc; 

ten wektor jest już wypełniona parami. Teraz chciałem uporządkować pary wewnątrz wektora opartego na podwójnej wartości wewnątrz pary

PRZYKŁAD:

Załóżmy, że mam 3 pary wewnątrz wektora. pair1 znajduje się z przodu, a para 3 na końcu. pair2 jest w środku:

pair1(1, proc1) 
pair2(3, proc2) 
pair3(2.5, proc3) 

teraz chcę, aby posortować pary w oparciu o podwójną wartość. Aby zamówienie w wektorze było:

pair1(1, proc1) 
pair3(2.5, proc3) 
pair2(3, proc2) 

Jak mogłem to zrobić? Jestem całkiem tknięty.

Dzięki za pomoc

Odpowiedz

22

w C++, można mieć niestandardowe funkcje porównawcze, które określają w jaki sposób zdecydować, czy jeden element idzie przed kolejnym podczas sortowania. W twoim przypadku, biorąc pod uwagę dwie pary, potrzebujesz tej z niższą wartością, aby pierwszy element trafił przed drugim. Można napisać funkcję komparatora tak:

// This function returns true if the first pair is "less" 
// than the second one according to some metric 
// In this case, we say the first pair is "less" if the first element of the first pair 
// is less than the first element of the second pair 
bool pairCompare(const std::pair<double, Processor*>& firstElem, const std::pair<double, Processor*>& secondElem) { 
    return firstElem.first < secondElem.first; 

} 

Teraz przekazać tę funkcję w swojej Metoda sortowania:

//The sort function will use your custom comparator function 
std::sort(baryProc.begin(), baryProc.end(), pairCompare); 
+1

+1 dobry przykład wyeliminowania porównania '.second' z normalnego operatora less 'std :: pair'. Wolałbym dla tego funktora (częściej inline), ale funkcjonalne rozwiązanie działa bez żadnych ograniczeń. – WhozCraig

+0

Dzięki za to dobre wyjaśnienie. Domyślam się, że standardowy komparator będzie działał dobrze. Czy sortowanie według standardowego sortowania jest prawidłowe, jeśli podwójne wartości często są takie same? np .: (1, proc1), (1, proc2), (2, proc3), (3, proc4), (3, proc5), .... – user2633791

+1

@ user2633791 To, o co pytasz, to czy sortowanie jest [stabilny] (http://en.wikipedia.org/wiki/Stable_sort#Stability). Algorytm sortowania jest stabilny, jeśli dwa elementy o tej samej wartości pozostają w tej samej kolejności względem siebie na końcu sortowania, tak jak na początku. Domyślny algorytm sortowania nie jest stabilny, ale STL zapewnia [stabilny sort] (http://www.cplusplus.com/reference/algorithm/stable_sort/), który powinien odpowiadać twoim celom. – maditya

25
#include <algorithm> 

int main(){ 

    std::vector<std::pair<double,Processor*>> baryProc; 

    std::sort(baryProc.begin(),baryProc.end()); 
} 

pamiętać, że nie potrzebują niestandardowej porównawczy ponieważ domyślna porównawczych para robi to, co chcesz. Najpierw porównuje pierwszy element i jeśli są identyczne, porównuje drugi element w parze.

+0

Ten * będzie * działał, jeśli wartości 'double' są gwarantowane unikatowe (faktycznie" zestaw ") .Ale bez takiej gwarancji (przez w razie potrzeby) musisz napisać komparator, domyślny komparator dla 'pair' zwykle ma wartość' return (a.first WhozCraig

+0

nie mamy warunku, aby nam pomóc, co zrobić, gdy pierwsze elementy są takie same, więc co się stanie, jeśli użyjemy domyślnego komparatora ? –

+0

Dlaczego podałeś 'std :: vector' i' std :: pair', ale nie 'std :: sort'? Gdybyś to zrobił, mógłbyś pozbyć się całkowicie' using namespace std' – Kevin