Implementieren von Mitgliedsfunktionskomparatoren zum Sortieren
In C erfordert das Sortieren einer Sammlung eine Komparatorfunktion. Der Versuch, eine Mitgliedsfunktion als Komparator zu verwenden, kann zu einem Kompilierungsfehler führen.
Problem
Betrachten Sie die folgende Klasse:
class MyClass { int * arr; // ... doCompare( const int & i1, const int & i2 ) { // uses member variables } doSort() { std::sort(arr,arr+someSize, &doCompare); } };
Kompilieren Dieser Code kann einen Fehler erzeugen:
ISO C verbietet die Verwendung der Adresse einer nicht qualifizierten oder in Klammern gesetzten nichtstatischen Adresse Mitgliedsfunktion, um einen Zeiger auf die Mitgliedsfunktion zu bilden.
Lösung
Um dieses Problem zu lösen, besteht ein Ansatz darin, doCompare zu einer statischen Mitgliedsfunktion zu machen. Wenn doCompare jedoch Zugriff auf MyClass-Daten erfordert, können Sie MyClass in einen Vergleichsfunktor umwandeln.
Dies kann erreicht werden, indem Sie Folgendes ändern:
doCompare( const int & i1, const int & i2 ) { // use some member variables }
in:
bool operator () ( const int & i1, const int & i2 ) { // use member variables }
Dann rufen Sie die Sortierfunktion wie folgt auf:
doSort() { std::sort(arr, arr+someSize, *this); }
Zusätzlich sollte die doSort-Methode einen Wert zurückgeben, wie zum Beispiel void.
Eine andere Möglichkeit besteht darin, die Mitgliedsfunktion innerhalb der Klasse einzuschließen, wie im folgenden Beispiel gezeigt:
class MyClass { struct Less { Less(const MyClass& c) : myClass(c) {} bool operator () ( const int & i1, const int & i2 ) {// use 'myClass'} MyClass& myClass; }; doSort() { std::sort(arr, arr+someSize, Less(*this)); } };
Das obige ist der detaillierte Inhalt vonWie kann ich eine Member-Funktion als Komparator in C „std::sort' verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!