C++ sort()使用自定义字符串数字比较器出现异常行为问题咨询
问题根因
你的自定义比较器comp违反了std::sort对比较函数的严格弱序要求,触发未定义行为,这是问题的核心原因。
具体错误点
C++标准要求,std::sort传入的比较函数comp必须满足:对任意相同元素a,comp(a,a)必须返回false(反自反性)。
你的比较器中,当两个输入字符串完全相等时,遍历完所有字符仍未找到不同位,此时你返回了true:
if(i==s1.size()) return true; // 错误逻辑
这就导致comp("5", "5")返回true,完全不符合严格弱序的要求。
为什么16个元素正常、17个元素报错
GCC默认的libstdc++库中,std::sort的实现对小数据量做了特殊优化:
- 待排序元素数量 ≤ 16时,使用插入排序实现,该实现对比较器的规则敏感度低,即使不符合严格弱序也可能侥幸正常运行
- 待排序元素数量 > 16时,切换为快速排序实现,该实现高度依赖比较器的严格弱序规则,违规的比较器会导致排序逻辑出现数组越界、非法内存操作等问题,你遇到的
std::length_error就是未定义行为的典型表现。
修复方案
只需修改相等场景的返回值即可:
bool comp(string s1,string s2){ if(s1.size()!=s2.size()) return s1.size()<s2.size(); int i=0; while(i<s1.size() && s1[i]==s2[i]) i++; if(i==s1.size()) return false; // 相等时返回false,满足严格弱序要求 return s1[i]<s2[i]; }
也可以直接用字符串默认的字典序比较简化代码,逻辑完全等价,额外添加const引用还能避免不必要的字符串拷贝、提升性能:
bool comp(const string& s1, const string& s2) { if (s1.size() != s2.size()) return s1.size() < s2.size(); return s1 < s2; }
内容的提问来源于stack exchange,提问作者user410918
相关产品推荐
相关产品推荐

