2013-08-07 6 views
12

Heyho,Sorting einen Vektor von Paaren

i habe eine Frage über einen Vektor von Paaren Reihenfolge:

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

dieser Vektor bereits mit der paarweise gefüllt ist. Jetzt wollte ich die Paare innerhalb des Vektors auf dem doppelten Wert innerhalb des Paares

Beispiel sortieren:

nehme ich habe 3 Paare innerhalb des Vektors. pair1 ist vorne und pair 3 ist am Ende. pair2 ist in der Mitte:

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

jetzt möchte ich die Paare basierend auf dem doppelten Wert sortieren. So dass die Reihenfolge innerhalb des Vektors ist:

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

Wie könnte ich das tun? Ich bin ziemlich festgefahren.

Danke für die Hilfe

Antwort

22

In C++ können Sie benutzerdefinierte Komparatorfunktionen haben, bevor ein anderes Element geht bei der Sortierung festlegen, wie zu entscheiden, ob. In deinem Fall, wenn du 2 Paare hast, willst du, dass die mit dem niedrigeren Wert für das erste Element vor die andere geht. Sie können, wie so eine Vergleichsfunktion schreiben:

// 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; 

} 

Nun leiten Sie diese Funktion in die Sortiermethode:

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

+1 ein gutes Beispiel für das Eliminieren des '.second' Vergleichs vom normalen less-Operator von' std :: pair'. Ich würde einen Funktor dafür bevorzugen (eher inline), aber eine funktionale Lösung funktioniert trotzdem. – WhozCraig

+0

Danke für diese gute Erklärung. Ich schätze, der Standardkomparator wird gut funktionieren. Würde Standart Oparator richtig sortieren, wenn doppelte Werte oft gleich sind? zB: (1, proc1), (1, proc2), (2, proc3), (3, proc4), (3, proc5), .... – user2633791

+1

@ user2633791 Was Sie fragen ist, ob die Art ist [stabil] (http://en.wikipedia.org/wiki/Stable_sort#Stability). Ein Sortieralgorithmus ist stabil, wenn zwei Elemente mit dem gleichen Wert am Ende der Sortierung in der gleichen Reihenfolge zueinander stehen wie am Anfang. Der Standard-Sortieralgorithmus ist nicht stabil, aber STL bietet eine [stable sort] (http://www.cplusplus.com/reference/algorithm/stable_sort/), die für Ihre Zwecke geeignet sein sollte. – maditya

25
#include <algorithm> 

int main(){ 

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

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

Beachten Sie, dass Sie nicht einen benutzerdefinierten Komparator, weil der Standard-Komparator brauchen von Paar macht das, was du willst. Es vergleicht zuerst mit dem ersten Element und wenn sie identisch sind, vergleicht es das zweite Element in dem Paar.

+0

Dieses * wird * funktionieren, wenn die 'doppelten' Werte garantiert einzigartig sind (effektiv ein" Set "). Aber ohne eine solche Garantie (durch Bei Bedarf müssen Sie einen Komparator schreiben. Der Standardkomparator für 'Paar' gibt normalerweise eine' return (a.first WhozCraig

+0

wir haben keine Bedingung, um uns zu helfen, was zu tun ist, wenn die ersten Elemente gleich sind. Also was passiert, wenn wir Standardkomparator verwenden ? –

+0

Warum haben Sie 'std :: vector' und' std :: pair' angegeben, aber nicht 'std :: sort'? Wenn Sie das getan haben, könnten Sie das' using namespace std' Bit komplett loswerden. – Kevin