如何将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
相关产品推荐
相关产品推荐

