2017-10-16 90 views
-1

這一個是COMPAREX和compareY的qsort C++:用於調用 '的qsort'

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)); 
} 

這是的qsort調用compareY

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; 
} 

沒有匹配的功能這是調用的qsort在COMPAREX

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

return closestUtil(P, n); 
} 

,我不知道爲什麼有人說「注:候選人功能並不可行:從「很久很久沒有已知的轉換( const void void )'to'int( _Nonnull)(const void *,const void *)'for'4th argument「and」error:no matching function for call to'qsort'「

+0

如果我用很長很長整型int,而不是,它工作完全正常,我不知道爲什麼是用很長很長的int問題。 – truthprogrammer99

+0

你爲什麼要輸出結果,x-y是一個指針? –

+1

難道你不認爲問題可能是'int'和'long long int'是*不同類型*嗎? – molbdnilo

回答

2

函數快速排序要求相應的參數的函數類型是

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) 
+0

嘿感謝兄弟我明白了。你的解釋非常清楚。 – truthprogrammer99