qsort比较编译错误

fed*_*der 3 c++

我的medianfilter.cpp类调用qsort如下所示.

vector<float> medianfilter::computeMedian(vector<float> v) {
    float arr[100];
    std::copy(v.begin(), v.end(), arr);

    unsigned int i;
    qsort(arr, v.size(), sizeof(float), compare);
    for (i = 0; i < v.size(); i++) {
        printf("%f ", arr[i]);
    }
    printf("median=%d ", arr[v.size() / 2]);
    return v;
}
Run Code Online (Sandbox Code Playgroud)

我比较的实现是:

int medianfilter::compare(const void * a, const void * b) {
    float fa = *(const float*) a;
    float fb = *(const float*) b;
    return (fa > fb) - (fa < fb);
}
Run Code Online (Sandbox Code Playgroud)

而mediafilter.hpp中的声明设置为私有,看起来像这样:

int compare (const void*, const void*);
Run Code Online (Sandbox Code Playgroud)

发生编译错误: cannot convert ‘mediafilter::compare’ from type ‘int (mediafilter::)(const void*, const void*)’ to type ‘__compar_fn_t {aka int (*)(const void*, const void*)}’

我完全不明白这个错误.如何正确声明和实现此比较方法?谢谢!

Nei*_*irk 5

Compare是非静态成员函数,而qsort需要非成员函数(或静态成员函数).由于您的比较函数似乎不使用该类的任何非静态成员,您可以将其声明为静态.事实上,我不确定你的中值滤波器类是什么.也许你只需要一个命名空间.

为什么不直接对矢量进行排序而不是将其复制到第二个数组?此外,如果向量具有超过100个元素,则代码将中断.

sort的默认行为只是需要你,但为了完整起见,我展示了如何使用compare函数.

我也改变了函数的返回类型,因为我不明白为什么调用的函数computeMedian不会返回中位数.

namespace medianfilter
{
    bool compare(float fa, float fb)
    {
        return fa < fb;
    }

    float computeMedian(vector<float> v)
    {
        std::sort(v.begin(), v.end(), compare);
        // or simply: std::sort(v.begin(), v.end());
        for (size_t i = 0; i < v.size(); i++) {
            printf("%f ", v[i]);
        }

        if (v.empty())
        {
            // what do you want to happen here?
        }
        else
        {
            float median = v[v.size() / 2]; // what should happen if size is odd?
            printf("median=%f ", median); // it was %d before
            return median;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)