提问者:小点点

对任何类型的元素数组进行排序


嗨,我已经分配了任何类型分数排序数组(升序或降序),但当我调用函数doSomething时,它是错误的。

template <class T>
struct Fraction {
    T num, denom;  //num - Numerator ; demon-Denominator
};
template <class T>
void AscendingArrayFraction(Fraction<T> a[], int n)
{
    for (int i = 0;i < n;i++) {
        for (int j = i + 1;j < n;j++) {
            if (compareFraction(a[i], a[j]))
                swapFraction(a[i], a[j]);
        }
    }
}
template <class T>
void DescendingArrayFraction(Fraction<T> a[], int n)
{
    for (int i = 0;i < n;i++) {
        for (int j = i + 1;j < n;j++) {
            if (!compareFraction(a[i], a[j]))
                swapFraction(a[i], a[j]);
        }
    }
}
template <class T>
void doSomething(Fraction<T> a[], int n, T(*p) (Fraction<T>, int)) {
    return  p(a,n);
}
 int main()
{
    Fraction<int> a[100];
    int n;
    inputFraction(a, n);
    doSomething(a, n, AscendingArrayFraction(a,n));    // It's have a problem right here 
}

看来我还是不明白这一课(抽象)。 你能帮我修复功能吗??


共1个答案

匿名用户

在我看来,您似乎对函数指针(doSomething中的p)的使用感到困惑。 通常,在排序算法中使用函数指针时,函数指针的作用是比较两个对象。 所以你只有一个排序功能,你可以定制不同的比较功能。 看起来这就是你想要写的东西,但是你把它弄混了。

相反,您有两个排序函数AscendingArrayFractionDescendingArrayFraction,没有比较函数(CompareFraction在任何地方都没有定义),还有一个名为DoSomething的函数,其用途不明确。

这是代码应该看起来的样子

// true if a < b, false otherwise
template <class T>
bool compareFractionsAscending(Fraction<T> a, Fraction<T> b) {
    ...
}

// true if a > b, false otherwise
template <class T>
bool compareFractionsDescending(Fraction<T> a, Fraction<T> b) {
    ...
}

// sort array  using compareFractions function pointer
template <class T>
void sortFractions(Fraction<T> a[], int n, bool (*compareFractions)(Fraction<T>, Fraction<T>)) {
    ...
}

int main()
{
    Fraction<int> a[100];
    int n;
    inputFraction(a, n);
    sortFractions(a, n, compareFractionsAscending<int>);
}