std::map 默认按键升序排序,底层为红黑树,遍历begin()即得有序序列;需降序或自定义规则时传严格弱序比较器;unordered_map无序且不可排序;按值排序需导出至vector后手动sort。

std::map 默认就是按键排序的
不用额外写排序逻辑,std::map 底层用红黑树实现,插入时自动按 key 的 operator(或自定义比较器)升序排列。你每次用 <code>begin() 遍历,拿到的就是从小到大的顺序。
自定义比较函数控制排序方向或规则
如果要降序、或按字符串长度排序、或处理自定义类型,得传入比较器。注意:比较器必须是**严格弱序**(不能用 或 <code>== 判断),否则行为未定义。
常见写法:
- 降序:
std::map<int std::string std::greater>></int> - 自定义结构体:
struct Compare { bool operator()(const MyKey& a, const MyKey& b) const { return a.id ,然后声明为 <code>std::map<mykey int compare></mykey> - lambda 不可直接用于模板参数(编译不过),得用
decltype+ 变量捕获,但更推荐用函数对象或std::function(有性能损耗)
别误用 unordered_map 当 map 用
std::unordered_map 是哈希表,**完全不保证顺序**,遍历结果可能每次都不一样。如果你发现“排序失效”,先检查是不是误用了它。没有“让 unordered_map 排序”的合法方式——强行 sort 迭代器没意义,因为底层桶结构不支持稳定遍历顺序。
立即学习“C++免费学习笔记(深入)”;
性能差异也要留意:
-
map:插入/查找 O(log n),内存开销小,顺序天然稳定 -
unordered_map:平均 O(1),但最坏 O(n),且迭代顺序不可控
需要按值排序?map 本身做不到
std::map 只能按键排序,值(mapped_type)不影响结构。真要按值排,得把数据拷出来:
- 复制到
std::vector<:pair>></:pair> - 用
std::sort+ 自定义 lambda(比如[](const auto& a, const auto& b) { return a.second ) - 注意:这会失去 map 的查找效率,只是临时排序展示用
键排序是 map 的基本契约,但很多人第一次用时会下意识想“怎么让它按值排”或者“怎么逆序”,其实问题不在 map 本身,而在没分清“数据结构能力边界”。


















