ジェネリック比較
CoddyのCジャーニー「オブジェクト指向プログラミング」セクションの一部。レッスン 52/61。
C の標準ライブラリにある qsort や bsearch のようなジェネリック関数は、要素の型を知らずに要素を比較する方法を必要とします。その解決策が比較関数です。これは、ジェネリックアルゴリズムが 2 つの項目を比較する必要があるたびに呼び出す、あなたが記述する関数です。
比較関数の標準的なシグネチャは次のとおりです。
int compare(const void* a, const void* b);2つのパラメーターが const void* なのは、汎用関数がソート対象の型を認識していないためです。戻り値には特定の規約があります。
| 戻り値 | 意味 |
|---|---|
| 負の値 | a は b より前に来る |
| ゼロ | a は b と等しい |
| 正の値 | a は b より後に来る |
比較関数内で、void*ポインターを実際の型にキャストし、値を比較します。整数を比較する方法は次のとおりです。
int compare_ints(const void* a, const void* b) {
int val_a = *(const int*)a;
int val_b = *(const int*)b;
return val_a - val_b;
}減算のテクニックは整数にうまく機能します。a が小さい場合、結果は負になります。等しい場合はゼロ、大きい場合は正になります。この関数を qsort に渡して、整数配列を昇順に並べ替えられるようになりました。
チャレンジ
簡単qsortのような汎用アルゴリズムで使われる標準的な比較関数の規約に従って、2つの整数を比較する関数 compare_ints を記述してください。
この関数は2つの値を比較し、それらの順序関係を示す結果を返す必要があります。
戻り値の規約:
- 最初の整数が2番目の整数より前に来る場合(first < second)は、負の値を返す
- 両方の整数が等しい場合はゼロを返す
- 最初の整数が2番目の整数より後に来る場合(first > second)は、正の値を返す
パラメーター:
a(int):比較する最初の整数b(int):比較する2番目の整数
戻り値:順序を示す整数。a < b の場合は負、a == b の場合はゼロ、a > b の場合は正です。
ヒント:レッスンで扱った減算トリックを使うと、簡潔な1行の解決策になります。
自分で試してみよう
int compare_ints(int a, int b) {
// ここにコードを書いてください
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。
オブジェクト指向プログラミングのすべてのレッスン
自分で練習してみよう: Cオンラインコンパイラ