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!