优先选 std::unordered_map 统计频次,平均 o(1) 效率更高;需确保元素可哈希、包含对应头文件;统计后按次数排序需转存 vector 再 sort;字符串需预处理空格与大小写;小范围整数可用 vector 代替以提升性能。

用 std::map 或 std::unordered_map 统计频次最直接
不需要手写循环计数逻辑,C++ 标准库的关联容器天然适合做“元素 → 次数”映射。优先选 std::unordered_map,它平均 O(1) 插入和查找,比 std::map(O(log n))更快,除非你需要结果按 key 排序。
常见错误是把 vector 元素类型写错,比如 vector<string></string> 却用 unordered_map<int int></int>;或者忘记包含头文件 <unordered_map></unordered_map> 导致编译失败。
实操建议:
- 确认
vector元素类型支持哈希(int、string、char等内置/标准类型都行;自定义类型需手动提供哈希函数) - 初始化空
unordered_map<t int></t>,遍历vector时对每个元素执行count_map[val]++ - 注意:
operator[]会自动插入默认值(0),所以无需预先检查键是否存在
vector<int> v = {1, 2, 2, 3, 3, 3};
unordered_map<int int> count_map;
for (int x : v) count_map[x]++;
// 结果:count_map[1]==1, count_map[2]==2, count_map[3]==3
</int></int>
统计后想按出现次数排序?别直接对 map 排序
std::map 和 std::unordered_map 都不支持按 value 排序。强行用 std::sort 会报错,因为 map 的迭代器不是随机访问迭代器。
正确做法是把键值对拷进 vector<pair int>></pair> 再排序:
组合式C++代码评审方案,融合静态分析、AI推理、多轮迭代评审和C++专项检查,适用于PR审查、增量代码审查、全项目评审和代码质量评分,触发词包括review cpp、cpp代码评审、C++review、代码审查。
- 用
vector<pair t int>></pair>接收map的内容(注意const T,因为 map 的 key 是 const) - 用 lambda 表达式指定按
.second(即次数)降序排:[](auto& a, auto& b) { return a.second > b.second; } - 如果次数相同还想按元素值升序,加二级条件:
a.second != b.second ? a.second > b.second : a.first
vector<pair int>> sorted(count_map.begin(), count_map.end());
sort(sorted.begin(), sorted.end(), [](auto& a, auto& b) {
return a.second > b.second;
});
</pair>
元素类型是 string 时要注意大小写和空格
字符串频次统计看似简单,但实际数据常含隐藏差异:首尾空格、大小写混用、全角/半角字符。比如 "abc" 和 "abc " 在 unordered_map 中是两个不同 key。
若业务要求“忽略首尾空格”,得先调用 std::string::find_first_not_of 和 std::string::find_last_not_of 做 trim;若要“忽略大小写”,得统一转成小写(用 std::tolower 配合 locale 安全转换,别直接减 32)。
容易踩的坑:
- 用
std::transform转小写时没传std::locale(),导致非 ASCII 字符(如中文、德语变音符)出错 - trim 后忘了检查空字符串,导致
""被单独计为一次 - 没考虑 UTF-8 多字节字符,用
std::tolower直接处理 char 可能截断
大数据量下 unordered_map 可能慢于预分配数组
当 vector 元素是小范围整数(比如 0–999),且你知道最大值,用 vector 当哈希表反而更快、更省内存:
- 声明
vector<int> count_arr(max_val + 1, 0)</int>,直接用元素值作下标:count_arr[x]++ - 避免哈希计算、内存动态分配、桶冲突等开销
- 但必须确保所有
x都在[0, max_val]范围内,否则越界访问——这是最危险的坑,不会编译报错,但运行时崩溃或数据错乱
没有银弹。元素分布稀疏(比如只有 5 个数但最大值是 1e9)就别用数组,老实用 unordered_map。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!










