0

並べ替えアルゴリズムがあり、構造体のフィールドで並べ替えたい場合。私は基本的に、sortBy使用する正しいフィールドを継続的にチェックすることなく、パラメーター(この場合)がfieldOneとfieldTwoのどちらを比較するかを決定できる可能性を探しています。

void func(SomeType *arr, int length, int sortBy) {
    int i;
    for(int i = 0; i < length, i++) {
        if(sortBy == 1) {
            doSomethingTo(arr[i].fieldOne);
        }
        else if(sortBy == 2) {
            doSomethingTo(arr[i].fieldTwo);
        }
        // etc
    }
}
4

2 に答える 2

1

はい。解決策があります:

void sampleDoSomethingFunction(SomeType *arg) {
}

void func(SomeType *arr, int length, void (*doSomething)(SomeType *arg)) {
    int i;
    for(int i = 0; i < length, i++) {
        doSomething(&arr[i]);
    }
}

次に、次のように関数を呼び出します。

    func(arr,length, sampleDosomethingFunction);
于 2012-10-21T04:36:20.863 に答える
1

スタンダードCが何をするかを観察することができますqsort()。コンパレータ関数を使用して、任意のタイプの任意の配列をソートします。

void qsort(void *base, size_t nel, size_t width,
           int (*compar)(const void *v1, const void *v2));

v1コンパレータ関数は、前にソートする必要がある場合は負の値を返し、v2後にソートする必要がある場合は正の値を返し、このソート基準で値が等しい場合はゼロを返します。2つの値を比較する必要があることに注意してください。1つの値をそれ自体のへそと比較するだけでは不十分です。

あなたの例では、固定型をソートしているようです。を使用するqsort()ことも、コンパレータタイプのアイデアを借りて、それを自分の種類に適合させることもできます。

void func(SomeType *arr, int length, int (*comparator)(const SomeType *v1, const SomeType *v2))
{
    ...
    int cmp = comparator(&arr[i], &arr[j]);
    ...
}

コンパレータは次のようになります。

static int compare_fieldOne(const SomeType *v1, const SomeType *v2)
{
    if (v1->fieldOne < v2->fieldOne)
        return -1;
    else if (v1->fieldOne > v2->fieldOne)
        return +1;
    return 0;
}

さらに比較を行う必要がある場合は、句の後にテストのペアを追加しelse ifて、等式の場合を最後に残すことができます。

于 2012-10-21T04:38:56.370 に答える