2012-03-26 10 views
0

Hi ich habe einen Vektor von Zeigern, eigentlich ist jeder Zeiger ein Array, wo jedes Array ist:Wie benutzerdefinierte std :: sort Funktion verwenden?

int a, int b, Sequenz von Ganzzahlen variabler Größe.

Beispiel ungeordneter Vektor:

rows[0] => points to [1,2,...] 
rows[1] => points to [2,1,...] 
rows[2] => points to [3,1,...] 
rows[3] => points to [1,4,...] 
rows[4] => points to [1,1,...] 

Ausgabebeispiel:

rows[0] => points to [1,1,...] 
rows[1] => points to [1,2,...] 
rows[2] => points to [1,4,...] 
rows[3] => points to [2,1,...] 
rows[4] => points to [3,1,...] 

ich diesen Vektor auf diese Weise sortieren, muss ich die folgenden benutzerdefinierten Vergleichsfunktion zu erstellen:

bool cmpRow(unsigned int *a, unsigned int *b) 
{ 
    //Mesmo id word 
    if(a[0] == b[0]) 
    { 

     return (a[1] < b[1]); 
    } 
    else 
    { 
     return (a[0] < b[0]); 
    }   
} 

und ich verwende es folgendermaßen:

std::vector<unsigned int*> rows; 
. 
. 
//Insert some stuffs 
. 
. 
std::sort (rows.begin(), rows.end(), cmpRow); 

Aber das Ergebnis ist nicht wurde erwartet, kann mir jemand mit diesem Problem helfen?

Edit:

Eigentlich die Funktionen in Ordnung ist, das Problem in einer Funktion in einer Schleife war, riefen diese Funktionen der Sortierfunktion mehrmals als die notwendigen so das Ergebnis nicht die erwartete.

+1

'std :: sort' sortiert die Elemente des zugrunde liegenden Containers im Bereich * [first, last) *. Die Reihenfolge' 1,1,1,2,3' sagt aus, dass Ihre Elemente tatsächlich sortiert sind Die Container-Elemente sind Arrays in Ihrem Fall, so dass nur diese sortiert werden und sie sind.Scheinen Sie, was Sie wollen, ist die einzelnen Array-Elemente jedes Vektor-Element zu sortieren, das ist nicht, was "std :: sort" tut. –

+0

Veröffentlichen Sie auch Ihre erwartete Ausgabe. –

+0

Was ist der Typ von 'Zeilen'? Welches Ergebnis bekommst du (dass du das nicht erwartest)? – Attila

Antwort

-1

Ändern Sie Ihren Code so?

bool cmpRow(unsigned int *a, unsigned int *b) 
{ 
    //You need to safeguard against empty/equal rows 


    //Mesmo id word 
    if(a[0] == b[0]) 
    { 
     return cmpRow(a[1] < b[1]); 
    } 
    else 
    { 
     return (a[0] < b[0]); 
    }   
} 
+0

war Ich prüfe keine Fälle, weil es in meinem Fall keine leeren/gleichen Zeilen gibt. – Alessandro

+2

'a [1]' und 'b [1]' sind keine Zeiger und 'cmpRow' benötigt zwei Parameter, so dass dieser Code nicht kompiliert. Meinst du 'zurück cmpRow (& a [1], &b[1]);'? – Attila

+0

sollten Sie leeren Fall überprüfen, weil die rekursive Funktion irgendwo enden muss – nakiya

1

Ihre Funktion cmpRow sortiert die gegebenen Arrays in aufsteigender Reihenfolge auf den ersten beiden Mitglieder basiert (indem man zuerst die ersten Mitglieder zu vergleichen, und wenn sie gleich sind dann die zweiten Elemente zu vergleichen). Dies funktioniert gut und erzeugt die von Ihnen gemeldeten Ergebnisse, die nach dieser Logik korrekt sind. Wenn dies nicht das erwartete Ergebnis war, welches Ergebnis haben Sie erwartet,?

Verwandte Themen