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
Libérer: 2024-12-02 18:00:21
original
461 Les gens l'ont consulté

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

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

en :

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

Ensuite, appelez la fonction de tri comme suit :

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

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