推荐用 std::unordered_map 统计频率后配合 lambda 比较函数调用 std::sort 原地重排,引用捕获频次映射,频次相同时可加次级排序规则;注意排序会打乱原序且禁止在排序中修改映射。

用 std::map 或 std::unordered_map 统计频率再排序
直接对原数组按频率排序,本质是「先计数、再重排」。C++ 没有内置的「按频次排序数组」函数,必须分两步:先用哈希表统计每个值出现次数,再基于频次对原数组(或值集合)重排序。
推荐优先用 std::unordered_map,因为插入和查找平均 O(1),比 std::map 的 O(log n) 更快;但如果需要键有序(比如后续要遍历所有唯一值),才选 std::map。
注意:如果数组里有负数、大整数或自定义类型,std::unordered_map 仍可用,但需确保该类型支持哈希(基础类型如 int、long long 默认支持)。
用 std::sort 配合自定义比较函数实现原地重排
排序目标不是让频次数组升序,而是让原数组中元素按「自身出现频次升序/降序」排列;相同时可加次级规则(如值本身升序),避免不稳定。
- 必须传入频率映射作为捕获上下文,所以比较函数得是 lambda(或 functor),不能是普通函数指针
- 捕获方式推荐
[&freq](引用捕获),避免拷贝整个 map - 若频次相同,默认
std::sort不保证相对顺序(不稳定),加次级比较可控制:a != b ? freq[a]
示例(降序频次,频次相同时升序值):
std::vector
C++免费学习笔记(深入):立即使用
在学习笔记中,你将探索 C++ 的入门与实战技巧!











