如果我们不从std :: qsort返回0会怎样?

问题描述 投票:1回答:1

根据文档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;
c++ std qsort
1个回答
2
投票

根据C11标准(7.22.5 / 4),

[当相同的对象(由size个字节组成时,无论其当前位置如何在数组中)多次传递给比较函数,结果应为彼此一致。也就是说,对于qsort,他们应在数组,对于bsearch,相同的对象应始终以相同的方式与键。

您的比较函数违反了此要求,因为只要两个值相等,它就会返回1。当qsort使用比较功能比较两个相等的值xy时,它将返回1,告诉qsort x > y。如果以后比较yx,则比较函数将再次返回1,表示y > x。这两个结果彼此不一致。

此要求通过引用并入C ++ 17([alg.c.library] / 2)。因为违反了要求,所以行为是不确定的。

© www.soinside.com 2019 - 2024. All rights reserved.