【C++11】unoedered_map和map(部分转载)

1.结论

新版的hash_map都是unordered_map了,这里只说unordered_map和map.

运行效率:unordered_map最高,而map效率较低但提供了稳定效率和有序的序列。

占用内存:map内存占用略低,unordered_map内存占用略高,而且是线性成比例的。

什么时候使用哪个? 需要无序容器,快速查找删除,不担心略高的内存时用unordered_map;有序容器稳定查找删除效率,内存很在意时候用map。

2.原理

map的内部实现是二叉平衡树(红黑树);hash_map内部是一个hash_table一般是由一个大vector,vector元素节点可挂接链表来解决冲突,来实现.

【C++11】unoedered_map和map(部分转载)

hash_map其插入过程是:
  1. 得到key
  2. 通过hash函数得到hash值
  3. 得到桶号(一般都为hash值对桶数求模)
  4. 存放key和value在桶内。
 
其取值过程是:
  1. 得到key
  2. 通过hash函数得到hash值
  3. 得到桶号(一般都为hash值对桶数求模)
  4. 比较桶的内部元素是否与key相等,若都不相等,则没有找到。
  5. 取出相等的记录的value。
 
hash_map中直接地址用hash函数生成,解决冲突,用比较函数解决。

3.性能特点

非频繁的查询用map比较稳定;频繁的查询用hash_map效率会高一些,c++11中的unordered_map查询效率会更高一些,但是内存占用比hash_map稍微大点。unordered_map 就是 boost 里面的 hash_map 实现。
其实,stl::map对应于与java中的TreeMap,而boost::unordered_map对应于java中的HashMap
python中的map就是hashmap实现的,所以查询效率会比C++的map查询快。(java,python官方版的虚拟机都是用C语言实现的,所以内部的思想和方法都是通用的。)

若考虑有序,查询速度稳定,容器元素量少于1000,非频繁查询那么考虑使用map。
若非常高频查询(100个元素以上,unordered_map都会比map快),内部元素可非有序,数据大超过1k甚至几十万上百万时候就要考虑使用unordered_map(元素上千万上亿时4GB的内存就要担心内存不足了,需要数据库存储过程挪动到磁盘中)。
hash_map相比unordered_map就是千万级别以上内存占用少15MB,上亿时候内存占用少300MB,百万以下都是unordered_map占用内存少,
且unordered_map插入删除相比hash_map都快一倍,查找效率相比hash_map差不多,或者只快了一点约1/50到1/100。
综合非有序或者要求稳定用map,都应该使用unordered_map,set类型也是类似的。
unordered_map 查找效率快五倍,插入更快,节省一定内存。如果没有必要排序的话,尽量使用 hash_map(unordered_map 就是 boost 里面的 hash_map 实现)。

4.使用unordered_map

unordered_map需要重载hash_value函数,并重载operator ==运算符。
详细参考见(感谢orzlzro写的这么好的文章):
上一篇:jdk8系列一、jdk8 Lamda表达式语法、接口的默认方法和静态方法、supplier用法


下一篇:List Set Map