1.底层实现
map:基于红黑树(一种平衡的二叉搜索树)
unordered_map:基于哈希表实现
2.元素顺序
map:元素按照键的顺序(默认升序)存储
unordered_map:元素无序存储 顺序取决于哈希函数
3.时间复杂度
查找操作:
map:O(log n)
unordered_map:平均O(1) 最坏O(n)
插入/删除操作
map:O(log n)
unordered_map:平均O(1) 最坏O(n)
4.内存使用
map:通常占用较小内存 因为不需要维护哈希表
unordered_map:通常占用更多内存 因为需要维护哈希表
5.键的要求
map:键类型需要支持 < 操作或提供自定义比较函数
unordered_map:键类型需要支持哈希函数和 == 操作
6.迭代器稳定性
map:插入/删除操作不会使迭代器失效(除非删除当前元素)
unordered_map:插入操作可能导致重新哈希 使所有迭代器失效
7.使用场景
map:需要有序数据时使用
unordered_map:需要快速查找(尤其大量数据)且不关心顺序时
#include<map>
#include<unordered_map>
using namespace std;
int main(){
//map示例
map<int,string>m1;
m1[3] = "three";
m1[1] = "one";
m1[2] = "two";
//输出顺序:1,2,3
for(const auto& p : m1){
cout<<p.first<<":"<<p.second<<endl;
}
//unordered_map 示例
unordered_map<int,string>m2;
m2[3] = "three";
m2[1] = "one";
m2[2] = "two";
//输出顺序不确定
for (const auto& p : m2) {
cout<<p.first<<":"<<p.second<<endl;
}
return 0;
}