Maison >développement back-end >C++ >Comment puis-je utiliser une fonction membre comme comparateur en C `std::sort` ?

Comment puis-je utiliser une fonction membre comme comparateur en C `std::sort` ?

Mary-Kate Olsen
Mary-Kate Olsenoriginal
2024-12-02 18:00:21452parcourir

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

Implémentation de comparateurs de fonctions membres pour le tri

En C, le tri d'une collection nécessite une fonction de comparaison. Tenter d'utiliser une fonction membre comme comparateur peut entraîner une erreur de compilation.

Problème

Considérez la classe suivante :

class MyClass {
    int * arr;
    // ...

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

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

Compilation ce code peut générer une erreur :

ISO C interdit de prendre l'adresse d'une personne non qualifiée ou entre parenthèses fonction membre non statique pour former un pointeur vers la fonction membre.

Solution

Pour résoudre ce problème, une approche consiste à faire de doCompare une fonction membre statique. Cependant, si doCompare nécessite l'accès aux données MyClass, vous pouvez convertir MyClass en foncteur de comparaison.

Ceci peut être réalisé en remplaçant :

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

en :

bool operator () ( const int & i1, const int & i2 ) { // use member variables }

Ensuite, appelez la fonction de tri comme suit :

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

De plus, la méthode doSort doit renvoyer une valeur, tel que void.

Une autre option consiste à envelopper la fonction membre dans la classe, comme le montre l'exemple suivant :

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

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn