根据文档 qsort 应该像这样使用:
std::qsort(a, size, sizeof *a, [](const void* a, const void* b)
{
if(*a < *b) return -1;
if(*a> *a) return 1;
return 0;
});
Run Code Online (Sandbox Code Playgroud)
如果值相同并且我不介意哪个先出现,或者我更喜欢基于其他变量的一个在另一个之前,我可以这样做吗?
if(*a < *b) return -1;
else return 1;
Run Code Online (Sandbox Code Playgroud)
根据C11标准(7.22.5/4),
当相同的对象(由
size字节组成,不管它们在数组中的当前位置)被多次传递给比较函数时,结果应彼此一致。也就是说,因为qsort它们应该在数组上定义一个总排序,并且对于bsearch同一个对象应该总是以相同的方式与键进行比较。
您的比较函数违反了此要求,因为只要两个值相等,它就会返回 1。当qsort比较两个相等的值x,并y使用比较函数,它将返回1,告诉qsort那x > y。如果稍后比较yand x,则比较函数将再次返回 1,这意味着y > x。这两个结果彼此不一致。
此要求通过引用并入 C++17 ([alg.c.library]/2)。因为违反了要求,所以行为是未定义的。
| 归档时间: |
|
| 查看次数: |
60 次 |
| 最近记录: |