1.hash_map的使用
hash_map基于哈希表。哈希表最大的优点:数据的存储和查找消耗的时间大大降低,几乎可以看成是常数时间;而代价仅仅是消耗比较多的内存。然而在当前可利用内存越来越多的 情况下,用空间换时间的做法是值得的(典型的空间换时间)。另外,编码比较容易也是它的特点之一。
hash_map,首先分配一大片内存,形成许多桶。是利用hash函数,对key进行映射到不同区域(桶)进行保存。其插入过程是:
得到key
通过hash函数得到hash值
得到桶号(一般都为hash值对桶数求模)
存放key和value在桶内。
其取值过程是:
得到key
通过hash函数得到hash值
得到桶号(一般都为hash值对桶数求模)
比较桶的内部元素是否与key相等,若都不相等,则没有找到。
取出相等的记录的value。
hash_map中直接地址用hash函数生成,解决冲突用比较函数解决。这里可以看出,如果每个桶内部只有一个元素,那么查找的时候只有一次比较。当许多桶内没有值时,许多查询就会更快了(指查不到的时候).
由此可见,要实现哈希表, 和用户相关的是:hash函数和比较函数。这两个参数刚好是我们在使用hash_map时需要指定的参数。
实例:
#include <hash_map>
#include <string>
#include<iostream>
using namespace std;
int main()
{
hash_map<int, string> mymap;
mymap[9527] = "小五哥哥"; //插入
mymap[1000000] = "诗和远方";
mymap[10000] = "海子和歌";
mymap.insert(make_pair(1, "战斗龙卷风")); //插入
hash_map<int, string>::iterator iter = mymap.find(10000); //查找
if (iter != mymap.end()){
cout << iter->second << endl;
}
cout << mymap.size() << endl; //哈希表中元素个数
return 0;
}
总结:其实hash_map和map的接口用法一致
2.map的使用
和hash_map使用方法相同
3.两者的对比
- hash_map用hash表实现的,而map是用红黑树实现
- hash_map不是标准库的,而map是,若考虑移植性,应该少用hash_map
- c++11中纳入了unordered_map(内部也是hash实现),推荐用此容器替代hash_map
- 哈希表的好处:查询平均时间O(1),坏处,数据之间无顺序
- map保证了一个稳定的动态操作时间,查询、插入、删除的最坏和平均时间都是O(logN),内部本身就是按序存储