qsort 和 std::sort 表现不同
qsort and std::sort behaving differently
我很惊讶通过 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);
完整代码link =>
http://ideone.com/zN87tX
使用排序:
// 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);
完整代码 link 位于 =>
http://ideone.com/37Dc2S
您可以在排序操作前后查看 link 上的输出,并可能希望查看用于比较两个元组的 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;
}
或者,您也可以重用 cmpre()
来实现 cmpr()
。
bool cmpr(const tpl &l, const tpl &r) {
return (cmpre(&l, &r) < 0);
}
我很惊讶通过 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);
完整代码link => http://ideone.com/zN87tX
使用排序:
// 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);
完整代码 link 位于 => http://ideone.com/37Dc2S
您可以在排序操作前后查看 link 上的输出,并可能希望查看用于比较两个元组的 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;
}
或者,您也可以重用 cmpre()
来实现 cmpr()
。
bool cmpr(const tpl &l, const tpl &r) {
return (cmpre(&l, &r) < 0);
}