根据文档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;
});
如果值相同,并且我不介意哪个先出现,或者我更愿意根据其他变量将一个值排在另一个值之前,可以吗?
if(*a < *b) return -1;
else return 1;
根据C11标准(7.22.5 / 4),
[当相同的对象(由
size
个字节组成时,无论其当前位置如何在数组中)多次传递给比较函数,结果应为彼此一致。也就是说,对于qsort
,他们应在数组,对于bsearch
,相同的对象应始终以相同的方式与键。
您的比较函数违反了此要求,因为只要两个值相等,它就会返回1。当qsort
使用比较功能比较两个相等的值x
和y
时,它将返回1,告诉qsort
x > y
。如果以后比较y
和x
,则比较函数将再次返回1,表示y > x
。这两个结果彼此不一致。
此要求通过引用并入C ++ 17([alg.c.library] / 2)。因为违反了要求,所以行为是不确定的。