优先选用 std::unordered_map 统计字符频次,因其平均 O(1) 插入优于 std::map 的 O(log n);注意 char 符号性问题,必要时转 unsigned char;排序需导出至 vector 后自定义谓词:先按频次降序,频次相同时按字符 ASCII 升序。

用 std::map 或 std::unordered_map 统计字符频次
直接遍历字符串,对每个字符做计数即可。优先选 std::unordered_map<char int></char>,因为不关心字符顺序,哈希表平均 O(1) 插入比 std::map 的 O(log n) 更快。注意:char 有符号性问题,但 ASCII 字符(0–127)在绝大多数编译器下无影响;若需支持扩展 ASCII 或误传负值,可转为 unsigned char 再投射为 int 做 key。
常见错误是把 std::string::at() 或下标访问结果直接当 int 用,导致符号扩展(如 '\xFF' 变成 -1),但 map key 是 char 类型,本身没问题;真正出错多发生在后续排序时拿 char 当整数比较——所以统计阶段保持类型一致最稳妥。
按频次降序排序,频次相同时按字符 ASCII 升序稳定输出
不能直接对 map 排序(它按键有序),得把键值对搬进 vector,再用 std::sort。排序谓词要写清楚:先比 value(频次)降序,value 相等时比 key(字符)升序。别漏掉“频次相同时的处理”,否则 'a' 和 'b' 都出现 2 次,输出顺序可能每次不同(不稳定)。
std::sort
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











