c++ map unordered_map

在C++中最让我蛋疼的事情之一就是unordered_map千呼万唤才出来,在C++早期版本标准库里面只有map这个字典。 但是map的内部实现是采用的红黑树,众所周知,对于字典这类结构也可以用hash表来实现,也就是C++的标准库应该也要有hash_map这种数据结构。

  • 红黑树实现的map占用内存较小,但是查找效率不高,O(logn)的查找效率。
  • hash表实现的map占用内存较大,但是查找效率高,往往可以逼近O(1)的惊人查找效率。

在C++中关于map的hash表方法的实现是unordered_map这个数据结构,首次出现应该是在C++98那个年代的tr1这个命名空间里面出现。 使用方法写起来比较啰嗦。

C++ STL 的 hash_map(unordered_map) 理论上能达到 O(1) 的查找速度, 而 map 是 O(log(N)). 一般会认为, map 比 hash_map 慢, 但是, 具体慢多少呢? 和元素个数有关系吗? 有没有直观的数据?

为此, 我写了一个简单的测试程序, 分别在 100, 1000, 10000, 10000 个元素时, 对两种 map 进行查找, 对比下耗时. 结果如下:

items  type     timespan  timestamp
100    map      +0.432037 1382373147.689263
100    hash_map +0.140390 1382373147.829653
1000   map      +0.672411 1382373197.151690
1000   hash_map +0.152739 1382373197.304429
10000  map      +0.928384 1382373219.558242
10000  hash_map +0.185142 1382373219.743384
100000 map      +1.512256 1382373371.041342
100000 hash_map +0.373361 1382373371.414702

可以看到, 在元素数量较少时(1000 以内), hash_map 的速度是 map 的 3 到 4 倍. 而元素数量达到 10000 或者更多时, hash_map 的速度是 map 的 5 倍. 这就是直观的感受.

补充了插入速度:

100    build_map      +0.001180 1382443114.467226
100    build_hash_map +0.000371 1382443114.467597
1000   build_map      +0.002165 1382443150.065571
1000   build_hash_map +0.001629 1382443150.067200
10000  build_map      +0.012238 1382443170.254071
10000  build_hash_map +0.019952 1382443170.274023
100000 build_map      +0.121713 1382443188.696912
100000 build_hash_map +0.204433 1382443188.901345

可以看到, map 的插入速度比 hash_map 快速, 可以认为是 2 倍.


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值