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的构造速度较慢。




原创粉丝点击