汎用アルゴリズムの作成
2410 ワード
前にいろいろなアルゴリズムを書いたことがありますが、これらのコードを書くときに欠点があります.皆さんは発見しましたか?それは,これらのアルゴリズムで用いられるデータ構造が単純なintデータであることである.したがって、intのソートであれば、問題はありません.肝心なのは、もし他のデータ型だったら、私たちはどうすればいいのでしょうか.
C++では,クラス関数という解決策がある.泡のソートで言えば、私たちは完全にこのように書くことができます.
もちろん、classが上記のアルゴリズムを呼び出す必要がある場合は、typeデフォルトコンストラクション関数、typeコピーがコンストラクション関数の2つの関数を定義する必要があります.
では、C言語では何か方法がありますか?実は、それがvoid*という方法もあります.
具体的なアプリケーションでは、void*を自分の必要なデータポインタに変換するだけです.たとえばintソートであれば、次の2つの関数を追加する必要があります.
関数呼び出しは以下のようになり、データ変換がやや面倒になります.
まとめ:汎用関数を書く前に、特定のタイプのアルゴリズム関数 を書く必要があります.汎用アルゴリズムの鍵は、汎用コンテンツと具体的なデータ型をどのように分離するか である. C++とC言語は共通アルゴリズムにそれぞれ方法があり、多くの使用をお勧めします.特によく使われる関数
C++では,クラス関数という解決策がある.泡のソートで言えば、私たちは完全にこのように書くことができます.
template
void bubbleSort(type array[], int length)
{
if(NULL == array || 0 == length) {
return;
}
for (int i = 0; i < length - 1; i++) {
for (int j = 0; j < length - i - 1; j++) {
if (array[j] > array[j+1]) {
type temp = array[j];
array[j] = array[j+1];
array[j+1] = temp;
}
}
}
return;
}
もちろん、classが上記のアルゴリズムを呼び出す必要がある場合は、typeデフォルトコンストラクション関数、typeコピーがコンストラクション関数の2つの関数を定義する必要があります.
では、C言語では何か方法がありますか?実は、それがvoid*という方法もあります.
// - (Bubble Sort)
void bubbleSort(void* array[], int length, int (* compare)(void*, void*), void(* swap)(void*, void*)) {
for (int outer = 0; outer < length - 1; outer++) {
for (int inner = 0; inner < length - outer - 1; inner++) {
if(compare(array[inner], array[inner + 1])) {
swap(array[inner], array[inner + 1]);
}
}
}
return;
}
具体的なアプリケーションでは、void*を自分の必要なデータポインタに変換するだけです.たとえばintソートであれば、次の2つの関数を追加する必要があります.
int compare(void* var1, void* var2) {
int* p_var1 = (int*)var1;
int* p_var2 = (int*)var2;
return (*p_var1 > *p_var2) ? 1 : 0;
}
void swap(void* var1, void* var2) {
int* p_var1 = (int*)var1;
int* p_var2 = (int*)var2;
int temp = *p_var1;
*p_var1 = *p_var2;
*p_var2 = temp;
}
関数呼び出しは以下のようになり、データ変換がやや面倒になります.
//
void print(int array[], int length) {
for (int j = 0; j < length; j++) {
printf(" %d ", array[j]);
}
printf("
");
}
int main(int argc, const char * argv[]) {
int array[8] = { 49, 38, 65, 97, 76, 13, 27, 49 };
int *p_arrayp[8];
for (int i =0; i < 8; i ++) {
p_arrayp[i] = &array[i];
}
bubbleSort((void**)p_arrayp, 8, compare, swap);
print(array,8);
return 0;
}
まとめ: