用std::unordered_map统计频次是最直接的方式:键为元素,值为出现次数;需判空、避免未定义行为;值域有限时可用数组替代以提升性能;std::max_element可简化查找但需检查空容器。

用 std::unordered_map 统计频次是最直接的方式
众数本质是出现次数最多的元素,C++ 没有内置“找众数”函数,必须手动统计每个值的出现次数。用 std::unordered_map 是最自然的选择:键是数组元素,值是它出现的次数。
注意点:
- 如果数组为空,
std::unordered_map会是空的,后续遍历前必须检查 - 整型数组里可能有负数,
std::map也能用,但std::unordered_map平均 O(1) 插入更高效 - 若多个值并列最多(如
{1,1,2,2,3}),通常返回第一个遇到的众数;如需全部众数,得额外收集
std::vector<int> arr = {1, 2, 2, 3, 2, 4};
std::unordered_map<int int> count;
for (int x : arr) count[x]++;
int mode = arr[0];
int max_count = 0;
for (const auto& p : count) {
if (p.second > max_count) {
max_count = p.second;
mode = p.first;
}
}</int></int>
处理重复遍历和边界情况的常见错误
新手常犯的错是把初始 max_count 设为 0,却没考虑所有元素频次都 ≤ 0 的情况(比如空数组或全负频次——但频次不可能为负,所以真正风险是空容器导致循环不执行,mode 保持未定义值)。
更稳妥的做法:
- 先判空:
if (arr.empty()) throw std::runtime_error("empty array"); - 初始化
mode和max_count从count.begin()开始,避免依赖arr[0] - 不要在循环中反复调用
count.size()或count.find(x)—— 已经在遍历了,没必要再查
当数组元素范围有限时,用数组代替哈希表更高效
如果已知元素值域很小且连续(比如都是 0–999 的整数),直接开一个计数数组比 std::unordered_map 更快、更省内存,也避免哈希冲突和动态分配开销。
例如:
- 输入保证是
unsigned char范围(0–255),可声明int count[256] = {} - 若元素是 1–1000,但可能缺失,仍建议用偏移:
count[x - 1]++,前提是能确保x不越界 - 切记初始化为 0:
int count[1001] = {},否则栈上数组内容是未定义的
使用 std::max_element 配合 lambda 可简化查找逻辑
统计完频次后,不必手写循环找最大值。用 std::max_element 配合 lambda 更清晰,也更符合 STL 风格:
auto it = std::max_element(count.begin(), count.end(),
[](const auto& a, const auto& b) { return a.second first;
但要注意:
-
std::max_element返回的是迭代器,要解引用才能取到pair,再取.first - 如果
count为空,max_element返回end(),解引用会崩溃,必须提前检查 - 该方式不会改变算法复杂度,但代码更紧凑,也更容易看出意图
多值并列众数的情况容易被忽略——std::max_element 只返回第一个最大值,如果你需要所有众数,就得遍历整个 map 再筛选 second == max_count 的所有 first。
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











