Heim >Backend-Entwicklung >C++ >Wie kann ich eine Member-Funktion als Komparator in C „std::sort' verwenden?

Wie kann ich eine Member-Funktion als Komparator in C „std::sort' verwenden?

Mary-Kate Olsen
Mary-Kate OlsenOriginal
2024-12-02 18:00:21452Durchsuche

How Can I Use a Member Function as a Comparator in C   `std::sort`?

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!

Stellungnahme:
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