Heim > Backend-Entwicklung > C++ > Wie kann ich Mitgliedsfunktionen korrekt als Komparatoren in der C-Sortierung verwenden?

Wie kann ich Mitgliedsfunktionen korrekt als Komparatoren in der C-Sortierung verwenden?

Barbara Streisand
Freigeben: 2024-12-01 19:27:12
Original
859 Leute haben es durchsucht

How Can I Correctly Use Member Functions as Comparators in C   Sorting?

Behebung von Problemen mit Mitgliedsfunktionskomparatoren beim Sortieren

Im Zusammenhang mit der Sortierung mithilfe von Mitgliedsfunktionen als Komparatoren tritt aufgrund eines Verbots in ISO C ein häufiger Kompilierungsfehler auf Nehmen Sie die Adresse einer nicht qualifizierten oder in Klammern gesetzten nicht statischen Mitgliedsfunktion, um einen Zeiger auf eine Mitgliedsfunktion zu bilden.

Bedenken Sie Folgendes Folgender Codeausschnitt:

class MyClass {
   int * arr;
   // other member variables
   MyClass() { arr = new int[someSize]; }

   doCompare( const int & i1, const int & i2 ) { // use some member variables } 

   doSort() { std::sort(arr,arr+someSize, & doCompare); }

};
Nach dem Login kopieren

Der Fehler tritt auf, wenn versucht wird, die Adresse der Mitgliedsfunktion doCompare als drittes Argument für std::sort anzugeben. Um dieses Problem zu beheben, muss die Funktion doCompare als statisch deklariert werden. Dieser Ansatz schränkt jedoch die Fähigkeit von doCompare ein, auf Datenelemente von MyClass zuzugreifen.

Um diese Einschränkung zu überwinden, kann man MyClass in einen Vergleichsfunktor umwandeln, indem man doCompare wie folgt ändert:

bool operator () ( const int & i1, const int & i2 ) { // use some member variables }
Nach dem Login kopieren

Anschließend kann der Sortiervorgang wie folgt aufgerufen werden:

doSort() { std::sort(arr, arr+someSize, *this); }
Nach dem Login kopieren

Beachten Sie, dass der doSort-Methode ein Rückgabewert fehlt. Dies kann bei Bedarf korrigiert werden.

Alternativ kann std::mem_fun verwendet werden, um die Mitgliedsfunktion in eine freie Funktion umzuwandeln, die Syntax kann jedoch komplex sein. Dennoch wird empfohlen, die Funktion wie unten dargestellt in die Klasse einzuschließen:

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)); }
}
Nach dem Login kopieren

Das obige ist der detaillierte Inhalt vonWie kann ich Mitgliedsfunktionen korrekt als Komparatoren in der C-Sortierung verwenden?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Neueste Artikel des Autors
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage