【问题标题】:What happens if we don't return 0 from std::qsort?如果我们不从 std::qsort 返回 0 会发生什么?
【发布时间】:2020-05-17 21:02:56
【问题描述】:

根据文档,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;

【问题讨论】:

  • 不,您不能这样做,因为 qsort 将无法决定两个相等元素中的哪一个应该先行。您的情况是 cmp(a,b) 和 cmp(b,a) 都返回 1(对于相等的元素 a 和 b)这可能会与 qsort 算法混淆。
  • 考虑使用std::sort 而不是qsort

标签: c++ std qsort


【解决方案1】:

根据C11标准(7.22.5/4),

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

您的比较函数违反了此要求,因为只要两个值相等,它就会返回 1。当qsort 使用您的比较函数比较两个相等的值xy 时,它将返回1,告诉qsort x &gt; y。如果稍后它比较yx,那么比较函数将再次返回1,这意味着y &gt; x。这两个结果并不一致。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2023-04-05
    • 2012-01-13
    • 1970-01-01
    • 2017-04-05
    • 2017-05-06
    • 2019-10-07
    • 2018-07-28
    • 1970-01-01
    相关资源
    最近更新 更多