ソートの比較としてのメンバー関数
ソートの比較基準としてメンバー関数を使用する場合、次の制限によりコンパイル エラーが発生する可能性があります。 ISO C規格。この標準では、メンバー関数へのポインターを導出するために、修飾されていない、または括弧で囲まれた非静的メンバー関数を直接アドレス指定することを禁止しています。このようなエラーは、クラス内で配列を並べ替えようとしているときに発生することがあります。
この問題を解決するには、解決策の 1 つは、比較関数 doCompare を静的として宣言することです。ただし、関数が MyClass インスタンスからのデータに依存する場合、別のアプローチとして、クラスを比較ファンクターに変換します。これには、doCompare を変更して Operator() 関数を実装し、次のように std::sort を呼び出すことが含まれます。
doSort() { std::sort(arr,arr+someSize, *this); }
さらに、doSort メソッドの戻り値が欠落していることを考慮する価値があります。完全な実装では、次のようになります。
int* doSort() { std::sort(arr,arr+someSize, &doCompare); return arr; }
または、std::mem_fun とバインディングを使用してメンバー関数を自由関数に変換することもできます。もう 1 つのオプションは、次のスニペットに示すように、クラス内に関数を埋め込むことです:
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 サイトの他の関連記事を参照してください。