我的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*)}’
我完全不明白这个错误.如何正确声明和实现此比较方法?谢谢!
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)