コンパレーターとしてメンバー関数を使用したソートのコンテキストでは、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 サイトの他の関連記事を参照してください。