Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ qsort和std::sort的行为不同_C++_Sorting_Qsort - Fatal编程技术网

C++ qsort和std::sort的行为不同

C++ qsort和std::sort的行为不同,c++,sorting,qsort,C++,Sorting,Qsort,我很惊讶通过qsort和std::sort排序可以产生不同的结果。我需要帮助解释以下代码段的行为: 使用qsort: // 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) retu

我很惊讶通过
qsort
std::sort
排序可以产生不同的结果。我需要帮助解释以下代码段的行为:

  • 使用
    qsort

    // 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);
    
    //以下比较器已在qsort中使用。
    //如果lr 1
    int cmpre(常数无效*l,常数无效*r){
    如果((*(tpl*)l.fhf<(*(tpl*)r.fhf)
    返回-1;
    其他的
    如果((*(tpl*)l.fhf==(*(tpl*)r.fhf){
    如果((*(tpl*)l.nhf==(*(tpl*)r.nhf)
    返回0;
    其他的
    如果((*(tpl*)l.nhf>(*(tpl*)r.nhf)
    返回1;
    其他的
    返回-1;
    }否则
    返回1;
    }
    //排序语句如下所示:
    qsort(tlst、len、sizeof(tpl)、cmpre);
    
    完整代码链接=>

  • 使用排序:

    // 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);
    
    //以下比较器用于排序
    内部cmpr(施工tpl&l、施工tpl&r){
    如果(l.fhfr.nhf)
    返回1;
    其他的
    返回-1;
    }否则
    返回1;
    }
    //排序语句如下所示:
    排序(tlst、tlst+len、cmpr);
    
    在=>

  • 在排序操作之后和之前,您可以在链接上看到输出,并且可能希望查看用于比较两个元组的
    compr
    compre
    方法。我不明白为什么
    sort
    无法对数组进行排序,而
    qsort
    能够进行排序。

    cmpr()重写为

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

    qsort
    sort
    的比较函数规格不同。为什么sort和qsort的比较函数不同。谢谢你的快速回答。:-)我的意思是为什么C++希望排序函数和Q排序的比较函数具有不同的性质。设计者的想法是什么呢?@prem
    qsort
    来自C。它们是由不同的人编写的、为不同的人编写的非常不同的代码库。在C++中,<代码>排序< /COD>期望类似于<代码>的内容。
    bool cmpr(const tpl &l, const tpl &r) {
        return (cmpre(&l, &r) < 0);
    }