C++大数字符串比较自定义比较器等长返回a<b的原因
static bool cmp(string &a,string &b) { if(a.size()==b.size()) { return a<b; } return a.size()<b.size(); }
逻辑解释
这个自定义比较器是用来给无前置零的正整数字符串做升序排序的,长度相等时直接返回a < b的原因非常直观:
- 正整数的大小和位数强相关:位数不同时,位数更长的数字一定更大,比如4位的
"3922"必然小于5位的"12929",所以长度不等时直接比较长度即可。 - 位数相同时,数字大小顺序和字符串字典序完全匹配:C++的字符串
<运算符会从左到右逐位比对字符的ASCII码值,而数字字符'0'到'9'的ASCII码是连续递增的,正好对应数字本身的大小关系。比如"1892"和"1922"比较,前两位分别是'1'和'8'/'9','8'的ASCII码小于'9',直接得出"1892" < "1922",和数字实际大小结果完全一致,不需要额外手写逐位比较逻辑。
注意:该比较器存在适用限制,如果存储的字符串有前导零、负号或者非数字字符,比较结果会出错。
内容的提问来源于stack exchange,提问作者Jason Wang
相关产品推荐
相关产品推荐

