2016-11-27 6 views
-1

qsortstd::sortでソートすると、結果が異なる可能性が非常に驚いています。qsortとstd :: sortの動作が異なる

  1. qsort使用:

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

    :ソートを使用して

    // 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. 私は、次のスニペットの動作を説明する助けが必要完全なコードリンク=> http://ideone.com/37Dc2S

あなたは後にして、操作をソートする前に、リンク上の出力を見ることができますし、2つのタプルを比較するために使用comprcompre方法をチェックアウトすることをお勧めします。私はなぜsortが配列をソートすることができないのか理解していませんが、qsortはそうすることができます。

+4

'qsort'と' sort'の比較関数の仕様は_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; 
} 

として、あるいは、あなたはまた、 cmpr()を実装するために cmpre()を再利用することができます。

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

なぜsortとqsortの比較関数が異なるのですか?迅速な答えをありがとう。 :-)私が意味するのは、C++はsortとqsortのcompare関数の性質が異なると考えているからです。彼らがこれをしたデザイナーの心には何があったのでしょうか? –

+1

@prem 'qsort'はCから来ています。これらは、人によって書かれたものとは非常に異なるコードベースです。 C++では、 'sort'は' bool'を返す '<'と似た何かを期待しています。 Cでは、そのような制約はありません。 – Yakk

関連する問題