ホームページ >バックエンド開発 >C++ >C ソートでメンバー関数をコンパレータとして正しく使用するにはどうすればよいですか?

C ソートでメンバー関数をコンパレータとして正しく使用するにはどうすればよいですか?

Barbara Streisand
Barbara Streisandオリジナル
2024-12-01 19:27:12796ブラウズ

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

ソートにおけるメンバー関数のコンパレーターに関する問題への対処

コンパレーターとしてメンバー関数を使用したソートのコンテキストでは、ISO C での禁止事項により、一般的なコンパイル エラーが発生します。修飾されていない、または括弧で囲まれた非静的メンバー関数のアドレスを取得して、メンバーへのポインターを形成するfunction.

次のコード スニペットを考えてみましょう:

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

};

メンバー関数 doCompare のアドレスを std::sort の 3 番目の引数として指定しようとすると、エラーが発生します。この問題を解決するには、関数 doCompare を静的として宣言する必要があります。ただし、このアプローチでは、MyClass のデータ メンバーにアクセスする doCompare の機能が制限されます。

この制限を克服するには、doCompare を次のように変更して、MyClass を比較ファンクターに変換できます。

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

その後、並べ替え操作を次のように呼び出すことができます。

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

doSort メソッドには戻り値。必要に応じて修正できます。

また、std::mem_fun を使用してメンバー関数を自由関数に変換することもできますが、構文が複雑になる可能性があります。ただし、以下に示すように、関数をクラス内でラップすることをお勧めします。

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

以上がC ソートでメンバー関数をコンパレータとして正しく使用するにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。