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
Barbara StreisandOriginal
2024-12-01 19:27:12797Durchsuche

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); }

};

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 }

Anschließend kann der Sortiervorgang wie folgt aufgerufen werden:

doSort() { std::sort(arr, arr+someSize, *this); }

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)); }
}

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!

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