咨询:为何C++ std::sort使用<=比较器会触发运行时错误
为什么
std::sort用<=会崩溃,换成<就正常? 这是个非常典型的std::sort使用误区,我来给你把原因讲透:
首先你得知道,std::sort对传入的比较函数有一个硬性规则:必须满足严格弱序(Strict Weak Ordering)。这个规则里最关键的一条是:
对于任意两个元素
a和b,如果compare(a,b)返回true,那么compare(b,a)必须返回false;如果a和b是“等价”的(谁也不用排在谁前面),那compare(a,b)和compare(b,a)都得返回false。
回到你的代码里:当两个字符串长度相等时,compare(a,b)会返回true,同时compare(b,a)也会返回true——这直接打破了严格弱序的规则!std::sort的底层实现(不管是快排、归并还是其他变体)都依赖这个规则来处理元素的排序逻辑,一旦违反,就会触发未定义行为,表现出来就是运行时崩溃、死循环或者排序结果乱掉,你的程序报错就是这个原因。
而当你把判断改成a.size() < b.size()时,长度相等的字符串会让compare(a,b)和compare(b,a)都返回false,完全符合严格弱序的要求,std::sort自然就能正常工作了。
额外提一句:如果想让长度相同的字符串保留原来的相对顺序,可以用std::stable_sort,但注意它同样要求比较函数满足严格弱序,只是会保留等价元素的原始位置。
内容的提问来源于stack exchange,提问作者Abhishek Aggarwal
相关产品推荐
相关产品推荐

