Maison > développement back-end > C++ > Comment puis-je utiliser correctement les fonctions membres comme comparateurs dans le tri C ?

Comment puis-je utiliser correctement les fonctions membres comme comparateurs dans le tri C ?

Barbara Streisand
Libérer: 2024-12-01 19:27:12
original
805 Les gens l'ont consulté

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

Résoudre les problèmes liés aux comparateurs de fonctions membres dans le tri

Dans le contexte du tri utilisant les fonctions membres comme comparateurs, une erreur de compilation courante survient en raison d'une interdiction dans ISO C contre prendre l'adresse d'une fonction membre non statique non qualifiée ou entre parenthèses pour former un pointeur vers une fonction membre.

Considérez ce qui suit extrait de code :

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

};
Copier après la connexion

L'erreur se produit lors de la tentative de fournir l'adresse de la fonction membre doCompare comme troisième argument à std::sort. Pour résoudre ce problème, la fonction doCompare doit être déclarée comme statique. Cependant, cette approche limite la capacité de doCompare à accéder aux données membres de MyClass.

Pour surmonter cette limitation, on peut transformer MyClass en foncteur de comparaison en modifiant doCompare comme suit :

bool operator () ( const int & i1, const int & i2 ) { // use some member variables }
Copier après la connexion

Par la suite, l'opération de tri peut être invoquée comme :

doSort() { std::sort(arr, arr+someSize, *this); }
Copier après la connexion

Notez que la méthode doSort n'a pas de valeur de retour, qui peut être corrigé si nécessaire.

Alternativement, std::mem_fun peut être utilisé pour convertir la fonction membre en une fonction libre, mais la syntaxe peut être complexe. Néanmoins, il est recommandé d'envelopper la fonction dans la classe, comme illustré ci-dessous :

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)); }
}
Copier après la connexion

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!

source:php.cn
Déclaration de ce site Web
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
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal