qsort c ++:没有用于调用'qsort'的匹配函数

时间:2017-10-16 18:44:55

标签: c++ sorting qsort

这是compareX和compareY

struct Point
{
long long int x, y;
};


long long int compareX(const void* a, const void* b)
{
Point *p1 = (Point *)a,  *p2 = (Point *)b;
return (* (long long int * )(p1->x - p2->x));
}

long long int compareY(const void* a, const void* b)
{
Point *p1 = (Point *)a,   *p2 = (Point *)b;
return (* (long long int * )(p1->y - p2->y));
}

这是调用compareY的qsort

long long int stripClosest(Point strip[], long long int size, long long int 
d)
{
long long int min = d; 

qsort(strip, size, sizeof(Point), compareY); 


for (long long int i = 0; i < size; ++i)
    for (long long int j = i+1; j < size && (strip[j].y - strip[i].y) < min; 
++j)
        if (dist(strip[i],strip[j]) < min)
            min = dist(strip[i], strip[j]);

return min;
}

这是调用compareX的qsort

long long int closest(Point P[], long long int n)
{
qsort(P, n, sizeof(Point), compareX);

return closestUtil(P, n);
}

我不知道为什么会这么说“注意:候选函数不可行:没有已知的从'long long(const void *,const void )'转换为'int( _Nonnull) (const void *,const void *)'for 4th argument“和”error:没有匹配函数来调用'qsort'“

1 个答案:

答案 0 :(得分:2)

函数qsort要求相应参数的函数类型为

int ( const void *, const void * )

这也是指针的魔力

* (long long int * )(p1->x - p2->x)

不清楚,导致未定义的行为。

因此,例如,函数compareX可以通过以下方式定义

int compareX(const void *a, const void *b)
{
    const Point *p1 = static_cast<const Point *>(a);
    const Point *p2 = static_cast<const Point *>(b);

    return (p2->x < p1->x) - (p1->x < p2->x);
}

或者它可以用“C”链接声明

extern "C" int compareX(const void *a, const void *b)
{
    const Point *p1 = static_cast<const Point *>(a);
    const Point *p2 = static_cast<const Point *>(b);

    return (p2->x < p1->x) - (p1->x < p2->x);
}

考虑到在C ++中,您可以将标准算法std::sort与比较函数一起使用。

这是一个演示程序,它显示了使用标准C函数qsort和标准C ++算法std::sort的两种方法。

#include <iostream>
#include <iterator>
#include <algorithm>
#include <cstdlib>

struct Point
{
    long long int x;
    long long int y;
};

int compareX(const void *a, const void *b)
{
    const Point *p1 = static_cast<const Point *>(a);
    const Point *p2 = static_cast<const Point *>(b);

    return (p2->x < p1->x) - (p1->x < p2->x);
}

int main()
{
    {
        Point p[] = { { 2, 1 }, { 1, 1 }, { 3, 1 } };

        qsort(p, sizeof(p) / sizeof(*p), sizeof(Point), compareX);

        for (const auto &item : p)
        {
            std::cout << "(" << item.x << ", " << item.y << ") ";
        }
        std::cout << std::endl;
    }
    {
        Point p[] = { { 2, 1 },{ 1, 1 },{ 3, 1 } };

        std::sort( std::begin( p ), std::end( p ),
            [](const Point &a, const Point &b)
            {
                return a.x < b.x;
        });

        for (const auto &item : p)
        {
            std::cout << "(" << item.x << ", " << item.y << ") ";
        }
        std::cout << std::endl;

    }

    return 0;
}

程序输出

(1, 1) (2, 1) (3, 1)
(1, 1) (2, 1) (3, 1)