c++中的hash_map与map
来源:互联网 发布:地面铺什么最环保 知乎 编辑:程序博客网 时间:2024/06/06 07:46
hash_map
在介绍hash_map之前,先介绍一下map,map的底层容器是红黑树,这篇博客整理好以后,会学习一下红黑树。map存储键和值,通过键和值进行查找。map中的键不允许重复,因为map的基于红黑树实现的,所以具有自动排序功能,map中的值都是有序的。
介绍一下map的基本使用:
map的构造和数据插入
map<string, string>namemap; namemap["1"] = "1"; namemap["2"] = "2"; namemap["3"] = "3"; namemap.insert(pair<string, string>("4", "4"));
可以通过数组下标的形式进行插入,也可以使用insert方法具体方法可以查看api文档。
map数据的查询
if(namemap.find("1")!=namemap.end()){ cout<<"find"; }
通过find方法可以对key进行查询,注意end()方法是最后一个元素的后一位,所以如果find的返回值如果等于end,则说明没有找到。
map数据的遍历
map<string, string>::iterator itr; for (itr=namemap.begin(); itr!=namemap.end(); itr++) { cout<<itr->first<<":"<<itr->second<<endl; }first就代表key值,second就代表value值。
map介绍完以后,接着介绍hash_map。
hash_map基于hash table(哈希表)。哈希表最大的优点,就是把数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的情况下,用空间换时间的做法是值得的。另外,编码比较容易也是它的特点之一。
其基本原理是:使用一个下标范围比较大的数组来存储元素。可以设计一个函数(哈希函数,也叫做散列函数),使得每个元素的关键字都与一个函数值(即数组下标,hash值)相对应,于是用这个数组单元来存储这个元素;也可以简单的理解为,按照关键字为每一个元素“分类”,然后将这个元素存储在相应“类”所对应的地方,称为桶。
但是,不能够保证每个元素的关键字与函数值是一一对应的,因此极有可能出现对于不同的元素,却计算出了相同的函数值,这样就产生了“冲突”,换句话说,就是把不同的元素分在了相同的“类”之中。 总的来说,“直接定址”与“解决冲突”是哈希表的两大特点。
hash_map,首先分配一大片内存,形成许多桶。是利用hash函数,对key进行映射到不同区域(桶)进行保存。其插入过程是:
1.得到key
2.通过hash函数得到hash值
3.得到桶号(一般都为hash值对桶数求模)
4.存放key和value在桶内。
其取值过程是:
1.得到key
2.通过hash函数得到hash值
3.得到桶号(一般都为hash值对桶数求模)
4.比较桶的内部元素是否与key相等,若都不相等,则没有找到。
5.取出相等的记录的value。
hash_map中直接地址用hash函数生成,解决冲突,用比较函数解决。这里可以看出,如果每个桶内部只有一个元素,那么查找的时候只有一次比较。当许多桶内没有值时,许多查询就会更快了(指查不到的时候)。
注意:hash_map目前并没有纳入C++ 标准模板库中!!如果要使用stl中的hash_map则需要引入#include <unordered_map>!!
unordered_map<string, string> hashMap; hashMap["1"] = "hash1"; hashMap["2"] = "hash2"; hashMap["3"] = "hash3"; if (hashMap.find("1")!=hashMap.end()) { cout<<"find"<<endl; }
hash_map的简单使用,基本上跟map类似,具体使用可以查看官方文档。
接下来介绍一下hash_map和map的区别。
1.构造函数。hash_map需要hash函数,等于函数;map只需要比较函数(小于函数).
2.存储结构。hash_map采用hash表存储,map一般采用红黑树(RB Tree)实现。因此其memory数据结构是不一样的。
hash_map和map怎么选择。
hash_map 查找速度会比map快,而且查找速度基本和数据数据量大小,属于常数级别;而map的查找速度是log(n)级别。并不一定常数就比log(n)小,hash还有hash函数的耗时,明白了吧,如果你考虑效率,特别是在元素达到一定数量级时,考虑考虑hash_map。但若你对内存使用特别严格,希望程序尽可能少消耗内存,那么一定要小心,hash_map可能会让你陷入尴尬,特别是当你的hash_map对象特别多时,你就更无法控制了,而且hash_map的构造速度较慢。
- c++中的hash_map与map
- STL:map与hash_map
- hash_map与map
- Map与Hash_map
- Map与Hash_Map
- map与hash_map
- hash_map 与map 区别
- hash_map 与map介绍
- map与hash_map
- map 与 hash_map
- STL中的map、unordered_map、hash_map
- hash_map快于STL中的map
- map 与 hash_map 性能比较
- Hash_Map 与 Map的区别
- C++ hash_map 与 map 区别
- map与hash_map set multipleset
- C++的map与hash_map
- 哈希表 hash_map 以及 map与hash_map的比较
- CodeForces 810C
- Python小程序分享02——简单定时器
- TensorFlow(四)分类
- Java实现——顺时针打印N阶方阵
- unity3d android工程签名
- c++中的hash_map与map
- 题目198-数数
- 基于Zookeeper的分步式队列系统集成案例
- Unity中针对Android Apk的签名验证(C#实现),防止二次打包
- hexo+GitHub创建属于自己的博客
- Python游戏编程入门第一章
- MySQL两种引擎的区别
- [JZOJ5373]信仰是为了虚无之人
- 矩阵快速幂