You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何将qsort所用titleSort比较函数改写为std::sort适配版本

qsort比较函数适配std::sort的改写方案

std::sort对比较器的要求是实现严格弱序:比较函数comp(a,b)返回true时,表示a应该排在b前面,对应原qsort比较器返回负整数的场景;返回false时,表示a不需要排在b前面,对应原qsort返回0或正整数的场景。

原代码中sorta为排序方向控制变量,取值1为升序,取值-1为降序;tsort为排序维度切换变量,改写时保留两个全局变量的原有逻辑即可,同时可以将原函数的void*无类型参数替换为const Title&强类型引用,省去不安全的指针强转操作。

改写后的完整代码

int tsort = 1, sorta = 1;

static auto titleSort(const Title& c1, const Title& c2) -> bool {
    switch (tsort) {
        case 0:
            return sorta == 1 ? c1.listID < c2.listID : c1.listID > c2.listID;
        case 1: {
            const int cmp = strcmp(c1.shortName, c2.shortName);
            return sorta == 1 ? cmp < 0 : cmp > 0;
        }
        case 2:
            if (c1.isTitleOnUSB == c2.isTitleOnUSB) return false;
            return sorta == 1 ? c1.isTitleOnUSB : !c1.isTitleOnUSB;
        case 3:
            if (c1.isTitleOnUSB != c2.isTitleOnUSB) {
                return sorta == 1 ? c1.isTitleOnUSB : !c1.isTitleOnUSB;
            }
            {
                const int cmp = strcmp(c1.shortName, c2.shortName);
                return sorta == 1 ? cmp < 0 : cmp > 0;
            }
        default:
            return false;
    }
}

调用方式

如果待排序的是存储Title对象的容器,比如std::vector<Title> title_list,直接调用:

std::sort(title_list.begin(), title_list.end(), titleSort);

额外说明

  • 原case0中用两个listID做差返回的写法存在整数溢出隐患,改写后直接用大小判断,规避了这个潜在问题
  • 不需要保留原qsort版本返回-1/0/1的逻辑再做正负判断,直接返回布尔表达式的执行效率更高
  • 该改写完全保留了原函数的所有排序逻辑,排序结果和原qsort调用结果完全一致

内容的提问来源于stack exchange,提问作者Xpl0itU

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.29 12:25:18