ジェネリック比較
CoddyのCジャーニー「Object Oriented Programming」セクションの一部 — レッスン 52/61。
C言語の標準ライブラリにある qsort や bsearch のようなジェネリック関数は、型を知ることなく要素を比較する方法を必要とします。その解決策が比較関数です。これは、2つの項目を比較する必要があるときに、ジェネリックアルゴリズムが呼び出す、ユーザーが作成する関数のことです。
比較関数の標準的なシグネチャは以下の通りです:
int compare(const void* a, const void* b);両方のパラメータは 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行のソリューションになります。
チートシート
比較関数を使用すると、qsort や bsearch のような汎用アルゴリズムが、要素の型を知らなくても要素を比較できるようになります。
比較関数の標準的なシグネチャは以下の通りです:
int compare(const void* a, const void* b);汎用関数はソートされる型を知らないため、パラメータは 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 が小さい場合は結果が負になり、等しい場合はゼロ、大きい場合は正になります。
自分で試してみよう
int compare_ints(int a, int b) {
// ここにコードを記述してください
}
このレッスンには短いクイズがあります。レッスンを始めて解答し、進捗を記録しましょう。