2016-11-27 36 views
-1

我很驚訝,通過qsortstd::sort排序可以產生不同的結果。我需要幫助解釋下面的代碼片段的行爲:使用qsortqsort和std :: sort的行爲有所不同

  1. // the following comparator has been used in qsort. 
    // if l<r : -1, l==r : 0 , l>r 1 
    int cmpre(const void *l, const void *r) { 
        if ((*(tpl *)l).fhf < (*(tpl *)r).fhf) 
         return -1; 
        else 
        if ((*(tpl *)l).fhf == (*(tpl *)r).fhf) { 
         if ((*(tpl *)l).nhf == (*(tpl *)r).nhf) 
          return 0; 
         else 
         if ((*(tpl *)l).nhf > (*(tpl *)r).nhf) 
          return 1; 
         else 
          return -1; 
        } else 
         return 1; 
    } 
    
    // and sort statement looks like : 
    qsort(tlst, len, sizeof(tpl), cmpre); 
    

    完整的代碼鏈接=> http://ideone.com/zN87tX

  2. 使用類別:

    // the following comparator was used for sort 
    int cmpr(const tpl &l, const tpl &r) { 
        if (l.fhf < r.fhf) 
         return -1; 
        else 
        if (l.fhf == r.fhf) { 
         if (l.nhf == r.nhf) 
          return 0; 
         else 
         if (l.nhf > r.nhf) 
          return 1; 
         else 
          return -1; 
        } else 
         return 1; 
    } 
    // and sort statement looks like : 
    sort(tlst, tlst + len, cmpr); 
    

    完整的代碼鏈接在=> http://ideone.com/37Dc2S

你可以看到鏈路上的輸出,後整理術前,不妨來看看用來比較兩個元的comprcompre方法。我不明白爲什麼sort不能排序數組,而qsort能夠這樣做。

+4

'qsort'和'sort'的比較函數的spec是_different_。 – timrau

回答

3

重寫cmpr()作爲

bool cmpr(const tpl &l, const tpl &r){ 
    if(l.fhf != r.fhf) return l.fhf < r.fhf; 
    return l.nhf < r.nhf; 
} 

或者,您也可以重用cmpre()實現cmpr()

bool cmpr(const tpl &l, const tpl &r) { 
    return (cmpre(&l, &r) < 0); 
} 
+0

爲什麼sort和qsort的比較函數是不同的。感謝你及時的答覆 。 :-)我的意思是,爲什麼C++需要sort和qsort的比較函數的不同特性。設計師想到的是他們做了這件事。 –

+1

@prem'qsort'來自C.它們是由不同的人編寫的非常不同的代碼庫。在C++中,'sort'需要類似於'<'的東西,它會返回一個'bool'。在C中,不存在這樣的約束。 – Yakk