c++11 map和unordered_map
来源:互联网 发布:帝国cms好还是织梦好 编辑:程序博客网 时间:2024/06/05 18:17
在c++11标准前,c++标准库中只有一种map,但是它的底层实现并不是适合所有的场景,如果我们需要其他适合的map实现就不得不使用比如boost库等三方的实现,在c++11中加了一种map unordered_map,unordered_set,他们的实现有什么不同呢?
map底层才用的是红黑树的实现查询的时间复杂度为O(logn),看起来并没有unordered_map快,但是也要看实际的数据量,虽然unordered_map的查询从算法上分析比map快,但是它有一些其它的消耗,比如哈希函数的构造和分析,还有如果出现哈希冲突解决哈希冲突等等都有一定的消耗,因此unordered_map的效率在很大的程度上由它的hash函数算法决定,而红黑树的效率是一个稳定值。
unordered_map的底层才用哈希表的实现,查询的时间复杂度为是O(1)。所以unordered_map内部就是无序的,数据是按散列函数插入到槽里面去的,数据之间无顺序可言,如果我门不需要内部有序,这种实现是没有问题的。unordered_map属于关联式容器,采用std::pair保存key-value形式的数据。用法与map一致。特别的是,STL中的map因为是有序的二叉树存储,所以对key值需要有大小的判断,当使用内置类型时,无需重载operator < ;但是用用户自定义类型的话,就需要重载operator < 。 unoredered_map全程使用不需要比较元素的key值的大小,但是,对于元素的==要有判断,又因为需要使用hash映射,所以,对于非内部类型,需要程序员为其定义这二者的内容,对于内部类型,就不需要了。unordered库使用“桶”来存储元素,散列值相同的被存储在一个桶里。当散列容器中有大量数据时,同一个桶里的数据也会增多,造成访问冲突,降低性能。为了提高散列容器的性能,unordered库会在插入元素是自动增加桶的数量,不需要用户指定。但是,用户也可以在构造函数或者rehash()函数中,指定最小的桶的数量。
还有另外一点从占用内存上来说因为unordered_map才用hash结构会有一定的内存损失,它的内存占用回高于map。
最后就是她们的场景了,首先如果你需要对map中的数据排序,就首选map,他会把你的数据按照key的自然排序排序(由于它的底层实现红黑树机制所以会排序),如果不需要排序,就看你对内存和cpu的选择了,不过一般都会选择unordered_map,它的查找效率会更高。
- c++11 map和unordered_map
- map、hash_map和unordered_map
- unordered_map和map
- unordered_map和map
- 【C++】unordered_map,unordered_set,map和set的用法和区别
- C++中的unordered_map和map
- unordered_map和map的区别
- 【c++】unordered_set和unordered_map
- c++11 无序map unordered_map
- (C++)unordered_map 与 map 的对比
- unordered_map & map
- <map>\<unordered_map>
- 【C++】【总结】unordered_map,unordered_set,map和set的用法和区别
- map 和 unordered_map以char * 为key
- map/unordered_map原理和使用整理
- STL map和unordered_map的区别
- c++中map和unordered_map区别
- map,hash_map和unordered_map 实现比较
- MTK(Android N)设置SDCard为默认存储
- java虚拟机(一)--内存区的划分
- Angular2简单使用
- VMware更改虚拟机网卡的MAC地址
- Matlab图像剪切,超出图像区域指定颜色填充
- c++11 map和unordered_map
- SSM框架配置多数据源连接不同的数据库
- java util工具类
- Java NIO系列教程(六) Selector
- spark mllib 相关使用
- 错误记录(10)SyntaxError: identifier starts immediately after numeric literal
- [Java]运算符优先级参考图表
- Spring应用中注入Spring bean的情况总结
- phpcms 路由配置